正确使用dplyr 0:7.0+中的dplyr :: select,使用字符向量选择列

罗宾·L

假设我们有一个字符向量,cols_to_select其中包含一些我们想从数据帧中选择的列df,例如

df <- tibble::data_frame(a=1:3, b=1:3, c=1:3, d=1:3, e=1:3)
cols_to_select <- c("b", "d")

假设我们还想使用,dplyr::select因为它是使用的操作的一部分,%>%因此使用select使代码易于阅读。

似乎有许多方法可以实现,但是有些方法比其他方法更健壮。请您让我知道哪个是“正确的”版本,为什么?也许还有另一种更好的方法?

dplyr::select(df, cols_to_select) #Fails if 'cols_to_select' happens to be the name of a column in df 
dplyr::select(df, !!cols_to_select) # i.e. using UQ()
dplyr::select(df, !!!cols_to_select) # i.e. using UQS()

cols_to_select_syms <- rlang::syms(c("b", "d"))  #See [here](https://stackoverflow.com/questions/44656993/how-to-pass-a-named-vector-to-dplyrselect-using-quosures/44657171#44657171)
dplyr::select(df, !!!cols_to_select_syms)

ps我意识到这可以通过简单地在base R中实现 df[,cols_to_select]

Zeehio

有一个示例dplyr::selecthttps://cran.r-project.org/web/packages/rlang/vignettes/tidy-evaluation.html使用:

dplyr::select(df, !!cols_to_select)

为什么?让我们探索您提到的选项:

选项1

dplyr::select(df, cols_to_select)

如您所说,如果cols_to_select恰好是df中的列名,则此操作失败,因此这是错误的。

选项4

cols_to_select_syms <- rlang::syms(c("b", "d"))  
dplyr::select(df, !!!cols_to_select_syms)

这看起来比其他解决方案更令人费解。

选项2和3

dplyr::select(df, !!cols_to_select)
dplyr::select(df, !!!cols_to_select)

在这种情况下,这两种解决方案提供相同的结果。你可以看到的输出!!cols_to_select,并!!!cols_to_select通过这样做:

dput(rlang::`!!`(cols_to_select)) # c("b", "d")
dput(rlang::`!!!`(cols_to_select)) # pairlist("b", "d")

!!UQ()操作员立即评估其说法的背景下,这就是你想要的。

!!!UQS()操作者被用于一次一个函数来传递多个参数。

对于示例中的字符列名称,将其作为单个长度为2的向量(使用!!)或作为两个长度为1的向量(使用)的列表都没有关系!!!对于更复杂的用例,您将需要使用多个参数作为列表:(使用!!!

a <- quos(contains("c"), dplyr::starts_with("b"))
dplyr::select(df, !!a) # does not work
dplyr::select(df, !!!a) # does work

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用字符串向量输入按dplyr中的多列分组

如何使用 dplyr 用 0 填充缺失的类别

使用ifelse()将dplyr中的布尔值列突变为1和0,得到的值大于1

当您具有colnames的字符向量时,如何不使用select()dplyr选择列?

R(dplyr):按ID计数一列中“ 1”之前的“ 0”个观测值的数目

为什么使用all_vars> 0的dplyr filter_all对字符串起作用?

当任何列包含1或0时,如何使用dplyr对该列进行突变

Dplyr:仅当行值> 0时才使用汇总来取列的平均值

dplyr 0.3.0.9000如何正确使用do()

使用 dplyr 无法正确识别 NA 值

在dplyr中的函数中使用字符串

使用dplyr选择列

dplyr使用字符串选择列并应用基本函数

使用字符串在dplyr(或基数R)中选择每行的列

我正在尝试使用 dplyr 重命名 R 中的因子,但我得到:错误:意外的 '=' in "cbc$Gender <- recode_factor(cbc$Gender, c(0,1) ="

R:dplyr。突变一个列,该列对行中的值为0的列进行计数

KeyError 0使用熊猫中的字符串选择位置

删除滞后== 0的成对行,并使用dplyr和链接计算百分比变化

响应中不允许使用HTTP标头“授权:承载eyJ0eXAiOiJK ........ 7rkFMLiRXERZwkT0”

使用dplyr中的mutate_at

用其他列的信息替换0 [dplyr]

Java 7中0_0的含义

使用request.getRemoteAddr()返回0:0:0:0:0:0:0:0:1

从 dplyr 中两个变量的值都 = 0 的数据集行中过滤掉

使用dplyr根据多列中的行值选择列

urxvt粗体颜色错误-粗体#0-7使用的是#8-15中的颜色

正确使用dplyr :: arrange和按列动态排序的方法

r-dplyr滞后默认0错误

显示 0 group_by dplyr 的组