我可以根据列表格式的查找表重命名DF吗



示例:

library(tidyverse)
names_lookup <- list(
'mpg' = 'miles_per_gallon',
'cyl' = 'cylinder'
)

我知道如何使用dplyr::rename 手动重命名列

my_mtcars <- mtcars %>% rename(miles_per_gallon = mpg, cylinder = cyl)

我想知道,有没有一种方法可以使用我的列表"names_lookup"在内部重命名列?

这里,我们需要在list中切换键/值

names_lookup <- list('miles_per_gallon' = 'mpg', 'cylinder' = 'cyl')

然后用!!!进行评估

library(dplyr)
mtcars1 <- mtcars %>% 
rename(!!! names_lookup)

-检查

names(mtcars1)
#[1] "miles_per_gallon" "cylinder"         "disp"             "hp"               "drat"             "wt"              
#[7] "qsec"             "vs"               "am"               "gear"             "carb"            names(mtcars)
#[1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

或者另一个选项是rename_at

mtcars %>% 
rename_at(vars(unlist(names_lookup)), ~ names(names_lookup))

如果数据集中不存在某些列名,我们可以根据值%in%的出现对list进行子集设置列名

names_lookup$hello <- 'Hello'
i1 <- unlist(names_lookup) %in% names(mtcars)
names_lookup_sub <- names_lookup[i1]
mtcars %>% 
rename_at(vars(unlist(names_lookup_sub)), 
~ names(names_lookup_sub))

或使用rename

mtcars1 <- mtcars %>% 
rename(!!! names_lookup[i1])

在基R中,我们可以使用match来查找列索引以替换名称。

names(mtcars)[match(names(names_lookup),names(mtcars))] <- unlist(names_lookup)
names(mtcars)
# [1] "miles_per_gallon" "cylinder"         "disp"             "hp"              
# [5] "drat"             "wt"               "qsec"             "vs"              
# [9] "am"               "gear"             "carb"            

最新更新