[英]Selectively Rename R Data Frame Column Names Using a Key, Value Pair Dictionary
我知道有一种简单的方法可以做到这一点,但我不记得我是如何做到的,也找不到我的笔记。 基本上我有一个带有一堆列名的数据框。 我还有一个键值对数据框,其中包含一些需要替换现有列名的新列名。 我想重命名所有有一对的列(没有一个没有)。 例如,我们可以使用 mtcars:
x<-mtcars
idkey <- data.frame("original" = c("cyl","hp"), "new" = c("cylinder", "horsepower"))
> 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
我只想替换 idkey 中存在的 x 中的列名。 所以在替换之后的名称(x)将从这个 go
> 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"
请注意,我只需要重命名键中存在的列,因此某些列可能不会被重命名,并且它们不会按任何特定顺序排列。
dplyr::recode
也可以:
colnames(x) <- dplyr::recode(
colnames(x),
!!!setNames(as.character(idkey$new), idkey$original)
)
在这种情况下, rename_at
会很有用。 从 'idkey' 的 'original' 列中指定要在vars
内重命名的vars
(这些列是factor
- 因此使用as.character
转换为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
我们可以在基础 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
数据
x<-mtcars
idkey <- data.frame("original" = c("cyl","hp"),
"new" = c("cylinder", "horsepower"), stringsAsFactors = FALSE)
甲dplyr>=1.0.0
溶液使用rename_with
:
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
您可以将类字典或查找表作为具有新旧配对名称的命名向量,并仅在 dict 上重命名 dataframe ,这样如果您尝试重新运行该块就不会失败。 这“合并”了名称。
rename_lookup <- c(
"to" = "from" ,
"cylinder" = "cyl",
"horsepower" = "hp"
)
mtcars %>% rename( any_of( rename_lookup ) )
你可以很容易地得到向量names(mtcars) %>% dput
并像这样粘贴它,以便快速按顺序编辑。
mtcars <- c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear", "carb")
mtcars <- c("mpg", "cylinder", "disp", "horsepower", "drat", "wt", "qsec", "vs", "am", "gear", "carb")
更进一步,您可以像这样快速构建字典
names(mtcars) %>%
dput %>%
capture.output %>%
str_replace_all(", ", ",\n ") %>%
writeLines
返回:
c("mpg",
"cyl",
"disp",
"hp",
"drat",
"wt",
"qsec",
"vs",
"am",
"gear",
"carb")
然后您可以以更易读的布局重命名,最终像以前一样再次使用它。
rename_lookup <-
c("MPG" = "mpg", # And add your column notes here
"CYLINDER" = "cyl", # And add your column notes here
"DISP" = "disp",
"HORSEPOWER"= "hp",
"..." = "drat",
"..." = "wt" ,
"..." = "qsec",
"..." = "vs" ,
"..." = "am" ,
"..." = "gear",
"..." = "carb")
mtcars %>% rename( any_of( rename_lookup ) )
但是,要小心,如果你想用 rename_lookup 直接赋值,那么你需要使用它的名字。 并且仅当 rename_lookup 包含完全相同的列数和含义时。
names(mtcars) <- names(rename_lookup)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.