【问题标题】:Tidy evaluation when renaming columns in dplyr重命名 dplyr 中的列时的整洁评估
【发布时间】:2019-02-28 03:12:31
【问题描述】:

我正在尝试使用rename()dplyr v0.7.0 中发布的整洁评估 语法动态重命名数据框中的单个列。

?rename 帮助页面,我找到了以下示例来重命名 2 列。

library(dplyr)

vars <- c(var1 = "cyl", var2 ="am")
rename(mtcars, !!vars) %>% head(1)

>           mpg var1 disp  hp drat   wt  qsec vs var2 gear carb
> Mazda RX4  21    6  160 110  3.9 2.62 16.46  0    1    4    4

但是,我注意到我不能使用相同的语法来重命名单个列。

vars <- c(var1 = "cyl")
rename(mtcars, !!vars) %>% head(1)

> Error: All arguments must be named

然而,当我将同一列重命名两次时,它可以工作。

vars <- c(var1 = "cyl", var1 = "cyl")
rename(mtcars, !!vars) %>% head(1)

>           mpg var1 disp  hp drat   wt  qsec vs am gear carb
> Mazda RX4  21    6  160 110  3.9 2.62 16.46  0  1    4    4

为什么会这样?正确的语法是什么?

【问题讨论】:

  • 上游问题:github.com/tidyverse/tidyselect/issues/77

标签: r dplyr rename tidyeval


【解决方案1】:

使用!!! 进行评估

rename(mtcars, !!!vars) %>% 
     head(1)
#          mpg var1 disp  hp drat   wt  qsec vs am gear carb
#Mazda RX4  21    6  160 110  3.9 2.62 16.46  0  1    4    4

【讨论】:

  • 谢谢。知道为什么 !! 评估在仅指定 1 列时会产生错误吗?
  • @Megatron !! 使用多个元素有点令人惊讶。如果您将其更改为list,则第一个选项将不起作用。在内部,可能是长度为 1 的向量,名称被剥离
  • 知道在哪里可以找到新的 tidy eval 正式规范吗?我以前从未见过!!! 运算符。此外,>1 元素重命名直接来自帮助页面。我认为向量/列表问题一定是一个错误。
  • 这看起来像一个错误,我已经提交了一个问题:github.com/tidyverse/tidyselect/issues/77
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 2018-06-09
  • 2020-04-28
  • 1970-01-01
  • 2018-06-10
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多