示例:
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"