【问题标题】:Selectively Rename R Data Frame Column Names Using a Key, Value Pair Dictionary使用键值对字典选择性地重命名 R 数据框列名
【发布时间】:2021-04-12 23:19:35
【问题描述】:

我知道有一种简单的方法可以做到这一点,但我不记得我是如何做到的,也找不到我的笔记。基本上我有一个带有一堆列名的数据框。我还有一个键值对数据框,其中包含一些需要替换现有列名的新列名。我想重命名所有有一对的列(没有一个没有)。例如,我们可以使用 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)将从这个

> 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"

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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    dplyr::recode 也可以:

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

    【讨论】:

      【解决方案2】:

      在这种情况下,rename_at 会很有用。从 'idkey' 的 'original' 列中指定要在 vars 中重命名的变量(这些列是 factor - 因此使用 as.character 转换为 character 类 - 因为 data.frame 默认选项是 @ 987654327@)

      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
      

      【讨论】:

      • 我相信这是我试图记住的确切解决方案。谢谢!
      【解决方案3】:

      我们可以在基础 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)
      

      【讨论】:

        【解决方案4】:

        使用rename_withdplyr&gt;=1.0.0 解决方案:

        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
        

        【讨论】:

          猜你喜欢
          • 2018-01-08
          • 2021-04-18
          • 2016-08-23
          • 2022-01-17
          • 2019-04-30
          • 2019-09-05
          • 1970-01-01
          • 1970-01-01
          • 2013-05-04
          相关资源
          最近更新 更多