`dplyr::select` 的用例是什么?
What is the use case for `dplyr::select`?
我通常非常喜欢整个 tidyverse
范例并广泛使用它。
但是dplyr
中的select
我根本看不懂。它比通过
简单地选择列更有用吗
my_df[,cols_of_interest]
?
"vanilla" R 方法似乎更简单,也更可靠。我可以将 cols_of_interest
作为变量,如上所述,或者我可以输入文字名称。尝试使用变量,然后使用 select_
,然后尝试使用 lazyeval
可能解释我的意图的整个方式,这看起来很疯狂。
是否存在 程序化 情况,其中 select
比 my_df[,cols_of_interest]
更有利? (这些天我很少写任何代码 "once",所以任何非程序化的东西都不是特别有用。)
此刻,我发现自己经常做这样的事情:
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]
?
独立地我不能给出使用 select 的充分理由,但在 dplyr 的其余部分的上下文中并与 magrittr 结合它允许像
x %>% filter(col1 == "foo")
%>% select(col2, col3)
%>% mutate(col4 = f(col2, col3))
它通过一系列操作提供了非常好的一致语法。
将 select
用于交互式会话,将 select_
用于 'programmatic' 目的...
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_
可以处理字符串,但是如果你给它一个包含多个字符串的向量,它不知道如何处理它(在这种情况下它只需要第一个元素并忽略其余的部分)。在第一个示例中,您将两个单独的字符串传递给两个单独的参数,而在第二个(和第三个)中,您将一个双元素向量传递给一个参数。
我仍然不确定 用例 的 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.)
因此,似乎 我们在您可能希望以编程方式有效使用 tidyverse
的任何情况下都使用 .dots
。然而,正如上面的例子所示,它的用法并不明显:有时你应该提供一个未计算的表达式,就像你从 quote
或 substitute
中得到的那样,有时你应该提供一个简单的字符串,就像你在标准表达式是 first-class 的任何示例。虽然我找不到关于 dots
的详细文档,但多次重读 this non-standard documentation 对我帮助很大。
我通常非常喜欢整个 tidyverse
范例并广泛使用它。
但是dplyr
中的select
我根本看不懂。它比通过
my_df[,cols_of_interest]
?
"vanilla" R 方法似乎更简单,也更可靠。我可以将 cols_of_interest
作为变量,如上所述,或者我可以输入文字名称。尝试使用变量,然后使用 select_
,然后尝试使用 lazyeval
可能解释我的意图的整个方式,这看起来很疯狂。
是否存在 程序化 情况,其中 select
比 my_df[,cols_of_interest]
更有利? (这些天我很少写任何代码 "once",所以任何非程序化的东西都不是特别有用。)
此刻,我发现自己经常做这样的事情:
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]
?
独立地我不能给出使用 select 的充分理由,但在 dplyr 的其余部分的上下文中并与 magrittr 结合它允许像
x %>% filter(col1 == "foo")
%>% select(col2, col3)
%>% mutate(col4 = f(col2, col3))
它通过一系列操作提供了非常好的一致语法。
将 select
用于交互式会话,将 select_
用于 'programmatic' 目的...
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_
可以处理字符串,但是如果你给它一个包含多个字符串的向量,它不知道如何处理它(在这种情况下它只需要第一个元素并忽略其余的部分)。在第一个示例中,您将两个单独的字符串传递给两个单独的参数,而在第二个(和第三个)中,您将一个双元素向量传递给一个参数。
我仍然不确定 用例 的 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.)
因此,似乎 我们在您可能希望以编程方式有效使用 tidyverse
的任何情况下都使用 .dots
。然而,正如上面的例子所示,它的用法并不明显:有时你应该提供一个未计算的表达式,就像你从 quote
或 substitute
中得到的那样,有时你应该提供一个简单的字符串,就像你在标准表达式是 first-class 的任何示例。虽然我找不到关于 dots
的详细文档,但多次重读 this non-standard documentation 对我帮助很大。