【问题标题】:dplyr not accepting paste0() as old_name in rename()dplyr 在 rename() 中不接受 paste0() 作为 old_name
【发布时间】:2021-07-28 23:41:19
【问题描述】:

我正在尝试构建一个导入一堆 csv 文件并清理它们的函数。其中一个清理功能涉及使用 dplyr rename() 从 csv 文件名中提取年份并将其粘贴到列名中。由于某种原因,它不起作用。我正在尝试找出原因。

这是一个简单的例子:

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 不接受 paste0 作为new_name 的输入。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    = 的 lhs 上的表达式将不起作用。而是使用 :=!!

    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
    

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 2021-01-19
      • 2018-01-14
      • 2021-06-14
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2020-01-07
      • 2023-03-10
      相关资源
      最近更新 更多