【问题标题】:Rename dataframe columns based on values in another dataframe in R根据 R 中另一个数据框中的值重命名数据框列
【发布时间】:2018-05-11 21:01:22
【问题描述】:

我有一个数据框,其中包含一列和两条记录。

DF1=

Name 
M_D
ABC123

我有另一个数据框,它有两列。我需要在第一个数据框中使用两个值重命名第二个数据框列。

DF2=

   PQR  LMN
   111  345
   456  999

我想要DF2如下

   M_D  ABC123
   111  345
   456  999

谢谢

【问题讨论】:

  • 你会在设计时知道任一 data.frame 的列名吗?或者两者都将永远是未知/不同的?
  • 到目前为止我知道,但我认为它可能会在未来发生变化,因为它是从每月文件中读取的,所以如果任何动态方法也很好,否则我可以编写一些代码。
  • 名称(DF2)

标签: r dataframe


【解决方案1】:

您可以在DF1 上使用$[[ 运算符访问DF2 的列名值。由于 OP 提到他甚至不知道DF1 的列名,因此可以选择:

names(DF2) <- DF1[,1]
DF2
#  M_D ABC123
#1 111    345
#2 456    999

#OR
names(DF2) <- DF1[[1]]

#OR
names(DF2) <- DF1$Name

注意: names(DF2) &lt;- DF1[1] 将不起作用,因为 DF1[1] 仍然是 data.frame 类型,而 names&lt;- 需要 vector

数据:

DF2 <- read.table(text = 
"PQR  LMN
111  345
456  999",
header = TRUE, stringsAsFactors = FALSE)

DF1 <- read.table(text = 
"Name 
M_D
ABC123",
header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    根据您上面的评论,我建议使用类似dplyr::rename() 的内容对其进行硬编码。

    DF2 <- DF2 %>% 
      dplyr::rename(
        M_D       = PQR,
        ABC123    = LMN
      )
    

    根据我的经验,您不应该真的相信合作者每次都会为您提供相同的数据集结构。如果他们更改了列名,这将引发错误(这很好——您希望在管道的早期就收到警告)。如果他们更改了列顺序,dplyr::rename() 将优雅而正确地处理它。

    考虑使用其他 defensive programming 工具,例如 checkmatetestit,以验证列特征是否符合您的预期(例如PQR/M_D 列是一个整数,其值介于0 和 5)。

    【讨论】:

      【解决方案3】:

      如果 DF1$Name 的长度与 DF2 的列数相同,这将起作用

      colnames(DF2) <- DF1$Name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 2020-11-13
        • 2018-12-21
        • 2021-11-22
        相关资源
        最近更新 更多