在R中选择列的规范方法

时间:2015-04-14 19:17:32

标签: r dplyr

我正在比较常见的"整理"在dplyr和"普通R" (请参阅output heresource here了解我的意思)。

我很难找到"规范" 和简明方式,仅使用变量名称选择列(通过规范,我的意思是,纯粹的简单R,对于对R的理解最少的人(因此没有" voodoo技巧")很容易理解)。

示例:

## subset: all columns from "var_1" to "var_2" excluding "var_3"

## dplyr: 
table %>% select(var_1:var_2, -var_3)

## plain R: 
r <- sapply(c("var_1", "var_2", "var_3"), function(x) which(names(table)==x))
table[ ,setdiff(r[1]:r[2],r[3]) ]

有任何改进普通R语法的建议吗?


修改

我实施了一些建议并比较了不同语法的效果,并注意到使用matchsubset会导致性能出现意外下降:

# plain R, v1
system.time(for (i in 1:100) { 
    r <- sapply(c("size", "country"), function(x) which(names(cran_df)==x))
    cran_df[,r[1]:r[2]] } )
##    user  system elapsed 
##   0.006   0.000   0.007

# plain R, using match
system.time(for (i in 1:100) { 
    r <- match(c("size", "country"), names(cran_df))
    cran_df[,r[1]:r[2]] %>% head(n=3) } )
##    user  system elapsed 
##   0.056   0.028   0.084

# plain R, using match and subset
system.time(for (i in 1:100) {
    r <- match(c("size", "country"), names(cran_df))
    subset(cran_df, select=r[1]:r[2]) %>% head(n=3) } )
##    user  system elapsed 
##  11.556   1.057  12.640

# dplyr
system.time(for (i in 1:100) select(cran_tbl_df,size:country))
##    user  system elapsed 
##   0.034   0.000   0.034

看起来subset的实施是次优的......

1 个答案:

答案 0 :(得分:8)

您可以使用内置的subset函数,该函数可以采用与select类似(但不完全相同)语法的dplyr::select参数。请注意,删除列必须在第二步完成:

t1 <- subset(table, select = var1:var2)
t2 <- subset(t1, select = -var_3)

或:

subset(subset(table, select = var1:var2), select = -var_3)

例如:

subset(subset(mtcars, select = c(mpg:wt)), select = -hp)