【发布时间】:2017-09-27 20:18:31
【问题描述】:
我通常非常喜欢整个 tidyverse 范式并广泛使用它。
但我根本不明白dplyr 中的select。它比简单地选择列更有用吗
my_df[,cols_of_interest]
?
“vanilla”R 方法看起来要简单得多,也更加健壮。我可以将cols_of_interest 作为变量,如上所述,或者我可以输入文字名称。尝试使用变量,然后使用select_,然后尝试与lazyeval 可能解释我的意图的整个方式发生争执,这似乎很疯狂。
是否存在程序化案例,其中select 比简单的my_df[,cols_of_interest] 更有优势? (这些天我很少写任何代码“一次”,所以任何不是编程的东西都不是特别有用。)
目前,我发现自己经常做以下事情:
new_df <- (old_df %>%
filter_(paste0("`",col_name, "`=='",col_val,"'")))[cols_to_keep]
这有点难看,但至少它有效,不像任何尝试执行的那样
new_df <- old_df %>%
filter_(paste0("`",col_name, "`=='",col_val,"'")) %>%
select_(cols_to_keep)
彻底失败了。
我可以举一个明确的例子,但这有点没抓住重点。 select over 的用例是什么,只需选择 my_df[,cols_of_interest]?
【问题讨论】:
-
它主要是 pipable。它还使用 NSE(非常适合交互式会话),可用于选择性地重命名,并具有一组不错的帮助函数,例如
num_range。它还可以与 dplyr 的各种后端(各种 SQL 风格、sparklyr、multidplyr)透明地工作。仅供参考,verb_版本在即将发布的版本中被弃用,转而支持rlang syntax。 -
my_df[,cols_of_interest]的等价物是my_df %>% select(one_of(cols_of_interest)) -
...或
mtcars %>% select_(.dots = c('mpg', 'hp'))使用当前版本或mtcars %>% select(!!!rlang::syms(c('mpg', 'wt')))使用0.6 -
一个可能的编程优势是
select总是返回一个data.frame,如果df是一个普通的data.frame 而...是一个单一变量,df[ , ...]就不会。没有逗号的子集(例如mtcars['wt'])实际上更安全,虽然一开始可能不太直观。 -
我同意你的观点,“动词”可能会失控。我想一个好处是能够在选择列时重命名它。基础会更难。
select(mtcars, miles=mpg, am:carb)和一系列行的冒号运算符非常酷。