使用键、值对字典有选择地重命名 R 数据框列名称

bhf*_*ffs 6 r dataframe

我知道有一个简单的方法可以做到这一点,但我不记得我是如何做到的,也找不到我的笔记。基本上我有一个带有一堆列名的数据框。我还有一个键值对数据框,其中有一些需要替换现有列名的新列名。我想重命名所有具有一对的列(并且没有一个没有)。例如我们可以使用 mtcars:

x<-mtcars
idkey <- data.frame("original" =  c("cyl","hp"), "new" = c("cylinder", "horsepower"))
Run Code Online (Sandbox Code Playgroud)
> head(x)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

> idkey
  original        new
1      cyl   cylinder
2       hp horsepower
Run Code Online (Sandbox Code Playgroud)

我只想替换 idkey 中存在的 x 中的列名。所以在替换名称(x)之后将从此

> names(x)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
Run Code Online (Sandbox Code Playgroud)

对此:

> names(x)
 [1] "mpg"  "cylinder"  "disp" "horsepower"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
Run Code Online (Sandbox Code Playgroud)

注意我需要这个来重命名键中存在的列,因此某些列可能不会被重命名,并且它们不会按任何特定顺序排列。

小智 8

dplyr::recode也可以工作:

colnames(x) <- dplyr::recode(
  colnames(x), 
  !!!setNames(as.character(idkey$new), idkey$original)
)
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

在这种情况下,rename_at会很有用。指定要在“idkey”的“原始”列中重命​​名的变量vars(这些列是factor- 因此请使用character-as.character因为data.frame默认选项是stringsAsFactors = TRUE

library(dplyr)
x %>%
    rename_at(vars(as.character(idkey$original)), ~ as.character(idkey$new)) %>%
    head(2)
#             mpg cylinder disp horsepower drat    wt  qsec vs am gear carb
#Mazda RX4      21        6  160        110  3.9 2.620 16.46  0  1    4    4
#Mazda RX4 Wag  21        6  160        110  3.9 2.875 17.02  0  1    4    4
Run Code Online (Sandbox Code Playgroud)