Dplyr 使用字符串变量作为表达式重命名

Posted

技术标签:

【中文标题】Dplyr 使用字符串变量作为表达式重命名【英文标题】:Dplyr rename using string variable as expression 【发布时间】:2021-05-19 16:51:34 【问题描述】:

我希望能够使用df %>% rename(string_var) 之类的字符串重命名变量,例如string_var = "A=B"

许多类似的问题,没有一个完全适用或参考已弃用的dplyr

从像这样的数据框开始

df = data.frame(
  A=1:4,
  B=5:8
)

我可以使用字符串变量作为条件进行过滤:

s = "A<4 & B>5"

通过

> df %>% filter(!!rlang::parse_expr(s))
  A B
1 2 6
2 3 7

> df %>% filter(eval(str2expression(s)))
  A B
1 2 6
2 3 7

我不知道如何对 rename 做同样的事情。

> s = "D=A"
> df %>% rename(!!rlang::parse_expr(s))
Error: object 'A' not found
> df %>% rename(eval(str2expression(s)))
Error: object 'A' not found

我也试过

> l = list(D="A")
> l
$D
[1] "A"

> df %>% rename(l)
Note: Using an external vector in selections is ambiguous.
i Use `all_of(l)` instead of `l` to silence this message.
i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
This message is displayed once per session.
Error: Must rename columns with a valid subscript vector.
x Subscript has the wrong type `list`.
i It must be numeric or character.
Run `rlang::last_error()` to see where the error occurred.
> df %>% rename(!!l)
Error: Must rename columns with a valid subscript vector.
x Subscript has the wrong type `list`.
i It must be numeric or character.
Run `rlang::last_error()` to see where the error occurred.

【问题讨论】:

【参考方案1】:

你走在正确的道路上。我们可以使用!!! 运算符来解析使用rename 的命名列表。

> s = list(D = 'A')
> df %>% rename(!!!s)
  D B
1 1 5
2 2 6
3 3 7
4 4 8

【讨论】:

甜蜜!看起来文档是here

以上是关于Dplyr 使用字符串变量作为表达式重命名的主要内容,如果未能解决你的问题,请参考以下文章

R dplyr:使用字符串函数重命名变量

在dplyr中,如何删除和重命名不存在的列,操作所有名称,并使用字符串命名新变量?

使用 dplyr 重命名变量 [重复]

使用 dplyr 重命名未命名的变量

dplyr 重命名 - 错误:`new_name` = old_name 必须是符号或字符串,而不是公式

R语言dplyr包select函数rename函数dataframe变量抽取及重命名实战