我正在比较dplyr和"纯R"中常见的“整理”操作(请参见此处的输出和此处的源代码,以了解我的意思)。
我很难找到一种“规范”且简洁的方法,只使用变量名来选择列(所谓的规范,指的是纯粹的R语言,并且容易为任何具有最基本的R语言理解的人所理解(因此不包括“巫术技巧”))。
例如:
任何改进基本R语法的建议吗?
编辑
我实施了一些建议,并比较了不同语法的性能,发现使用match和subset会导致性能惊人的下降:
我很难找到一种“规范”且简洁的方法,只使用变量名来选择列(所谓的规范,指的是纯粹的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语法的建议吗?
编辑
我实施了一些建议,并比较了不同语法的性能,发现使用match和subset会导致性能惊人的下降:
# 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
的实现不够优化...
r <-
行可以替换为r <- match(c("var_1", "var_2", "var_3"), names(table))
。 - David Robinsonmatch
和subset
?为什么不直接使用subset(cran_df, select=size:country)
呢? - David Robinson