繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM