`dplyr :: select`的用例是什么?

时间:2017-04-30 00:38:36

标签: r dplyr tidyverse

我通常非常喜欢整个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)

完全失败。

我可以给出一个明确的例子,但有点遗漏了这一点。只需选择selectmy_df[,cols_of_interest] 超过的用例是什么?

3 个答案:

答案 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 。但是,正如上面的例子所示,它的用法并不明显:有时候你应该提供一个未经评估的表达式,就像你从quotesubstitute得到的那样,有时你也会提供一个简单的字符串,就像你一样。在标准表达式为一等的任何示例中提供。虽然我找不到关于dots的详细文档,但对this non-standard documentation的一些重读有很多帮助。