【发布时间】:2016-04-04 04:40:51
【问题描述】:
有没有一种简洁的方法可以在dplyr 中选择特定类型的列?例如,如何选择dplyr链中的所有字符列?
【问题讨论】:
-
对 dplyr 包不太熟悉。但是你能做这样的事情吗?类似于
class函数:d <- tbl_df(iris); type_sum(d); select(d,which(type_sum(d)=="dbl"))
有没有一种简洁的方法可以在dplyr 中选择特定类型的列?例如,如何选择dplyr链中的所有字符列?
【问题讨论】:
class函数:d <- tbl_df(iris); type_sum(d); select(d,which(type_sum(d)=="dbl"))
Dplyr 0.5 有 select_if() 允许你写 select_if(is.character)
【讨论】:
截至dplyr 1.0.0 *_if 功能和朋友已被取代。现在建议使用来自tidyselect 的selection helper where。
https://dplyr.tidyverse.org/reference/select.html
https://tidyselect.r-lib.org/reference/where.html
library(dplyr)
starwars %>%
select(where(is.character))
#> # A tibble: 87 x 8
#> name hair_color skin_color eye_color sex gender homeworld species
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 Luke Skywa~ blond fair blue male mascul~ Tatooine Human
#> 2 C-3PO <NA> gold yellow none mascul~ Tatooine Droid
#> 3 R2-D2 <NA> white, bl~ red none mascul~ Naboo Droid
#> 4 Darth Vader none white yellow male mascul~ Tatooine Human
#> 5 Leia Organa brown light brown fema~ femini~ Alderaan Human
#> 6 Owen Lars brown, grey light blue male mascul~ Tatooine Human
#> 7 Beru White~ brown light blue fema~ femini~ Tatooine Human
#> 8 R5-D4 <NA> white, red red none mascul~ Tatooine Droid
#> 9 Biggs Dark~ black light brown male mascul~ Tatooine Human
#> 10 Obi-Wan Ke~ auburn, whi~ fair blue-gray male mascul~ Stewjon Human
#> # ... with 77 more rows
由reprex package (v0.3.0) 于 2020 年 6 月 2 日创建
【讨论】:
你可以这样做
dt %>% select(which(sapply(.,is.character)))
【讨论】:
一种方法是首先获取不同列的类。所以假设我们有一些数据:
library(dplyr)
DT <- data.frame(A = letters[1:6], B = c(T,F,F), C = seq(1,2,length.out = 6), D = 1:6)
dt <- tbl_df(DT)
dt$A <- as.character(dt$A)
输出
A B C D
(chr) (lgl) (dbl) (int)
1 a TRUE 1.0 1
2 b FALSE 1.2 2
3 c FALSE 1.4 3
4 d TRUE 1.6 4
5 e FALSE 1.8 5
6 f FALSE 2.0 6
我们现在可以使用 which 函数获取类:
cls <- sapply(dt, class)
cls
输出
A B C D
"character" "logical" "numeric" "integer"
现在直截了当:
newDF <- dt %>% select(which(cls=="character"))
newDF
输出
A
(chr)
1 a
2 b
3 c
4 d
5 e
6 f
【讨论】: