使用单独数据帧中的值重命名列

stl*_*lba 5 r dplyr

我有一个 tibble,其中的列名包含空格和特殊字符,这使得使用起来很麻烦。我想在处理数据时将这些列名称更改为更易于使用的名称,然后在最后将它们更改回原始名称以进行显示。理想情况下,我希望能够将其作为管道的一部分来完成,但是我还没有弄清楚如何使用rename_with().

样本数据:

df <- tibble(oldname1 = seq(1:10),
             oldname2 = letters[seq(1:10)],
             oldname3 = LETTERS[seq(1:10)])


cols_lookup <- tibble(old_names = c("oldname4", "oldname2", "oldname1"), 
                      new_names = c("newname4", "newname2", "newname1"))
Run Code Online (Sandbox Code Playgroud)

期望的输出:

> head(df_renamed)
# A tibble: 6 x 3
  newname1 newname2 oldname3
     <int> <chr>    <chr>   
1        1 a        A       
2        2 b        B       
3        3 c        C       
4        4 d        D       
5        5 e        E       
6        6 f        F 
Run Code Online (Sandbox Code Playgroud)

在此工作期间,某些列被删除并重新排序,因此当将它们转换回来时,表中将cols_lookup不再存在df. 还创建了一些新列,df我希望在其中保持名称不变。

我知道已经有人问过类似的问题,但是答案要么不适用于 tibbles 或在管道中(例如,那些使用match()),要么如果列不全部存在于两个表中的顺序相同。

akr*_*run 6

我们可以用rename_at。从主查找表中,数据集的filternames具有匹配 ( filtered_lookup),然后在rename_at我们指定 'old_names' 的地方使用它vars并替换为 'new_names'

library(dplyr)
filtered_lookup <- cols_lookup %>% 
     filter(old_names %in% names(df)) 
df %>% 
  rename_at(vars(filtered_lookup$old_names), ~ filtered_lookup$new_names)
Run Code Online (Sandbox Code Playgroud)

或者使用rename_with, 使用相同的逻辑

df %>%
  rename_with(.fn = ~filtered_lookup$new_names, .cols = filtered_lookup$old_names)
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是从命名向量rename进行拼接 ( )!!!

library(tibble)
df %>% 
     rename(!!! deframe(filtered_lookup[2:1]))
Run Code Online (Sandbox Code Playgroud)