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

使用键、值对字典有选择地重命名R数据帧列名,r,dataframe,R,Dataframe,我知道有一个简单的方法可以做到这一点,但我不记得我是怎么做到的,也找不到我的笔记。基本上,我有一个数据框,其中有一堆列名。我还有一个键、值对数据框,它有一些新的列名,需要替换现有的列名。我想重命名所有有一对的列(没有一对没有)。例如,我们可以使用mtcars: x<-mtcars idkey <- data.frame("original" = c("cyl","hp"), "new" = c("cylinder", "horsepower")) 我只想替换idkey中存在的x中

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

x<-mtcars
idkey <- data.frame("original" =  c("cyl","hp"), "new" = c("cylinder", "horsepower"))
我只想替换idkey中存在的x中的列名。因此,在替换名称(x)之后,将从此处开始

> names(x)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
为此:

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

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

在这种情况下,
处重命名将非常有用。从“idkey”的“original”列中指定要在
vars
内重命名的变量(这些列是
factor
-因此使用
as.character
转换为
character
类,因为
data.frame
默认选项是
stringsafactors=TRUE


我们可以在base R中使用
match

names(x)[match(idkey$original, names(x))] <- idkey$new
head(x)

#                   mpg cylinder disp horsepower 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

names(x)[match(idkey$original,names(x))]
dplyr::recode
也可以:

colnames(x) <- dplyr::recode(
  colnames(x), 
  !!!setNames(as.character(idkey$new), idkey$original)
)

colnames(x)A
dplyr>=1.0.0
使用
rename\u的解决方案

library(tidyverse)
idkey2 <- idkey %>% pull(new, original)
x %>%
    rename_with(~ idkey2[.], !! names(idkey2)) %>%
    head()
#>                    mpg cylinder disp horsepower drat    wt  qsec vs am gear
#> Mazda RX4         21.0        6  160        110 3.90 2.620 16.46  0  1    4
#> Mazda RX4 Wag     21.0        6  160        110 3.90 2.875 17.02  0  1    4
#> Datsun 710        22.8        4  108         93 3.85 2.320 18.61  1  1    4
#> Hornet 4 Drive    21.4        6  258        110 3.08 3.215 19.44  1  0    3
#> Hornet Sportabout 18.7        8  360        175 3.15 3.440 17.02  0  0    3
#> Valiant           18.1        6  225        105 2.76 3.460 20.22  1  0    3
#>                   carb
#> Mazda RX4            4
#> Mazda RX4 Wag        4
#> Datsun 710           1
#> Hornet 4 Drive       1
#> Hornet Sportabout    2
#> Valiant              1
库(tidyverse)
idkey2%拉力(新的、原装的)
x%>%
使用(~idkey2[.],!!名称(idkey2))%>%重命名_
总目()
#>mpg气缸显示马力drat wt qsec vs am齿轮
#>马自达RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4
#>马自达RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4
#>Datsun 710 22.8 4 108 93 3.85 2.320 18.61 11 4
#>大黄蜂4路21.4 6 258 110 3.08 3.215 19.44 1 0 3
#>大黄蜂运动约18.7 8 360 175 3.15 3.440 17.02 0 3
#>英勇的18.1 6 225 105 2.76 3.460 20.22 1 03
#>碳水化合物
#>马自达RX44
#>马自达RX4 Wag 4
#>Datsun 710 1
#>大黄蜂4路1号
#>大黄蜂2号
#>勇敢的1

我相信这正是我试图记住的解决方案。谢谢
x<-mtcars
idkey <- data.frame("original" =  c("cyl","hp"), 
                    "new" = c("cylinder", "horsepower"), stringsAsFactors = FALSE)
colnames(x) <- dplyr::recode(
  colnames(x), 
  !!!setNames(as.character(idkey$new), idkey$original)
)
library(tidyverse)
idkey2 <- idkey %>% pull(new, original)
x %>%
    rename_with(~ idkey2[.], !! names(idkey2)) %>%
    head()
#>                    mpg cylinder disp horsepower drat    wt  qsec vs am gear
#> Mazda RX4         21.0        6  160        110 3.90 2.620 16.46  0  1    4
#> Mazda RX4 Wag     21.0        6  160        110 3.90 2.875 17.02  0  1    4
#> Datsun 710        22.8        4  108         93 3.85 2.320 18.61  1  1    4
#> Hornet 4 Drive    21.4        6  258        110 3.08 3.215 19.44  1  0    3
#> Hornet Sportabout 18.7        8  360        175 3.15 3.440 17.02  0  0    3
#> Valiant           18.1        6  225        105 2.76 3.460 20.22  1  0    3
#>                   carb
#> Mazda RX4            4
#> Mazda RX4 Wag        4
#> Datsun 710           1
#> Hornet 4 Drive       1
#> Hornet Sportabout    2
#> Valiant              1