r - 在 R 中选择列的规范方法

标签 r dplyr

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

我很难找到一种“规范”简洁的方式来选择仅使用变量名的列(规范,我的意思是,纯粹的普通 R 并且对于对 R 了解最少的人来说很容易理解(所以没有“巫毒伎俩”))。

例子:

## 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 的实现是次优的...

最佳答案

你可以使用内置的 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)

关于r - 在 R 中选择列的规范方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29635650/

相关文章:

r - 在 plyr 或 dplyr 中调试 - 查看哪个组

列中的 R grep 模式

r - 如何获得位于R中上一行和下一行的值之间的平均值?

R计算具有奇点的lm模型的稳健标准误差(vcovHC)

R:在自定义函数中将列名作为变量传递

php - 在 ubuntu 下的 php 中运行 R

python/pandas 相当于 dplyr 1.0.0 summarize(across())

r - 在R中简洁地创建一个区间变量

r - R中由带有dplyr的另一列分组的分类值的计数

r - 在 dplyr 链中格式化 tbl