我有一个 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()
),要么如果列不全部存在于两个表中的顺序相同。
我们可以用rename_at
。从主查找表中,数据集的filter
行names
具有匹配 ( 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)