我通常非常喜欢整个tidyverse
范例并广泛使用它。
但我根本不理解select
中的dplyr
。它比仅通过
my_df[,cols_of_interest]
“香草”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
,my_df[,cols_of_interest]
超过的用例是什么?
答案 0 :(得分:1)
使用select
进行互动式会话,使用select_
进行编程&#39;目的...
library(dplyr)
iris %>% select(Sepal.Width, Petal.Width)
cols_of_interest <- c("Sepal.Width", "Petal.Width")
iris %>% select_(.dots = cols_of_interest)
进一步说明......
另外,请注意以下两行不相同......
iris %>% select_("Sepal.Width", "Petal.Width")
iris %>% select_(c("Sepal.Width", "Petal.Width"))
这就是为什么这不像你期望的那样工作..
iris %>% select_(cols_of_interest)
select_
可以处理字符串,但是如果您正在为它添加一个包含多个字符串的向量,它就不知道如何处理它(在这种情况下它只需要第一个元素并忽略其余的)。在第一个示例中,您将两个单独的字符串传递给两个单独的参数,而在第二个(和第三个)中,您将两个元素向量传递给一个参数。
答案 1 :(得分:0)
我无法给出使用select的强有力的理由,但是在dplyr的其余部分的上下文中并且与magrittr结合它允许使用像
这样的东西x %>% filter(col1 == "foo")
%>% select(col2, col3)
%>% mutate(col4 = f(col2, col3))
通过一系列操作提供了非常好的一致语法。
答案 2 :(得分:0)
我仍然不完全确定select
(或select_
)的用例,除非您希望将单个列保留为数据框类型,而不是强制转换为矢量。
然而,为了部分回答我自己的问题,我至少已经找到tidyverse
友好的方式,以编程方式做我想做的事。
> mt_dt <- as_tibble(mtcars)
> expr1 <- quote(cyl == 8)
> cols_oi <- c("mpg", "cyl")
> mt_dt %>% filter_(.dots=expr1) %>% select_(.dots=cols_oi)
(This returns only the mpg & cyl columns, only when the cyl == 8.)
因此,似乎我们在您可能希望以编程方式有效使用.dots
的任何情况下使用tidyverse
。但是,正如上面的例子所示,它的用法并不明显:有时候你应该提供一个未经评估的表达式,就像你从quote
或substitute
得到的那样,有时你也会提供一个简单的字符串,就像你一样。在标准表达式为一等的任何示例中提供。虽然我找不到关于dots
的详细文档,但对this non-standard documentation的一些重读有很多帮助。