dplyr不接受paste0()作为rename()中old_name的名称

3
我想编写一个函数来导入一堆csv文件并对其进行清理。其中一个清理函数涉及从csv文件名中提取年份并将其粘贴到列名称中,使用dplyr rename()。但出现某种原因它不能工作。我正在努力找出原因。
以下是一个简单的示例:
df <- data.frame('value' = 1:5)
df
  value
1     1
2     2
3     3
4     4
5     5

然而,当我尝试重命名时:

rename(df, paste0('value', '_', gsub('([a-z]+_)|(\\.csv)', '', 'csv_2018.csv')) = 'value')

抛出异常:

Error: unexpected '=' in "rename(df, paste0('value', '_', gsub('([a-z]+_)|(\\.csv)', '', 'csv_2018.csv')) ="

值得注意的是,这个运作良好:

paste0('value', '_', gsub('([a-z]+_)|(\\.csv)', '', 'csv_2018.csv'))
[1] "value_2018"

同样,这个也可以很好地运行:

rename(df, 'value_2018' = 'value')
  value_2018
1          1
2          2
3          3
4          4
5          5

问题似乎出在paste0()上(而不是gsub()),因为它也不能工作:
rename(df, paste0('value', '_') = 'value')

抛出相同的错误:

Error: unexpected '=' in "rename(df, paste0('value', '_') ="

显然:paste0('value', '_')可以得到:"value_"

我可以用其他方法解决这个问题,但是想知道为什么dplyr不接受new_name的输入来自paste0

1个回答

3

= 左侧的表达式不能工作。请改用 :=!!

library(dplyr)
rename(df, !! paste0('value', '_', gsub('([a-z]+_)|(\\.csv)', '',
          'csv_2018.csv')) := 'value')
  value_2018
1          1
2          2
3          3
4          4
5          5

另一个选项是rename_with

rename_with(df, ~ paste0('value', '_', gsub('([a-z]+_)|(\\.csv)', '',
           'csv_2018.csv')), 'value')
  value_2018
1          1
2          2
3          3
4          4
5          5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接