【问题标题】:How can I rename all columns of a data frame based on another data frame in R?如何根据 R 中的另一个数据框重命名数据框的所有列?
【发布时间】:2020-12-22 14:19:37
【问题描述】:

我对 R 很陌生。我正在尝试根据另一个数据框重命名数据框的列。

基本上我的数据看起来像

数据帧1

A    B    C   D
1    2    3   4

我有另一个看起来像这样的表' 数据帧2

Col1    Col2
A       E
B       Q
C       R
D       Z

我想根据这个表重命名我的第一个数据框的列,这样它就会出来:

E    Q    R    Z
1    2    3    4

我正在尝试使用 plyr 库进行循环。这是我试过的命令:

library(plyr)
for (i in names(DataFrame1[,3:336])) #renaming columns 3 to 336
    { 
        rename(DataFrame1,
         replace = c(i = DataFrame2[DataFrame2$Col1 == i, 2])) 
    }

我的想法是对于 DataFrame1 中的每一列,使用 DataFrame2 中的列的查找来重命名该列。

这会产生 N 行错误“x:i 中不存在以下from 值”,其中 n 是 DataFrame1 中存在的行数

感谢您提供的任何帮助!

【问题讨论】:

  • 为了将来参考,您最好以可重现的方式分享您的示例数据,例如编写代码来创建它或使用dput

标签: r


【解决方案1】:
A    B    C   D
1    2    3   4

DataFrame1 <- read.table(con <- file("clipboard"), header=T)

Col1    Col2
A       E
B       Q
C       R
D       Z

DataFrame2 <- read.table(con <- file("clipboard"), header=T)

colnames(DataFrame1) <- DataFrame2$Col2

如果列名没有像示例中那样按顺序排列,则必须使用match

DataFrame2$Col2[match(names(DataFrame1),DataFrame2$Col1)]

【讨论】:

  • match 他们彼此可能更安全 - dat2$Col2[match(names(dat1),dat2$Col1)]
  • 哇!这么简单>_
  • 谢谢,如果df1的列名不在df2$Col1,那么我希望保持原样,在这种情况下我该如何修改你的代码?
  • @ahbon 我不太清楚你的意思。你能用一个例子提出一个新问题,然后把它的链接作为评论,以便我找到它吗?
【解决方案2】:

您可以简单地重命名基础 R 中的列

dt1 <- data.frame(A=1, B=2, C=3, D=4)

dt2 <- data.frame(Col1=c("A","B","C","D"),Col2=c("E","Q","R","Z"))

names(dt1) <- dt2$Col2

print(dt1)

E Q R Z
1 2 3 4

如果数据框长度相同,替换和 ifelse 函数也可以重命名列名

names(dt1) <- replace(names(dt1),!is.na(names(dt1)),dt2$Col2)
names(dt1) <- ifelse(!is.na(names(dt1)),dt2$Col2,NA)

print(dt1)

E Q R Z
1 2 3 4

【讨论】:

    【解决方案3】:

    我会为此使用“data.table”中的setnames

    library(data.table)
    # Might not work if your columns are factors, not characters
    # setnames(dt1, dt2$Col1, dt2$Col2)[]
    
    # Convert to character to use
    setnames(dt1, as.character(dt2$Col1), as.character(dt2$Col2))[]
    #   E Q R Z
    # 1 1 2 3 4
    

    如果包含新旧名称的data.frame的名称多于需要替换的名称,您可以将skip_absent=TRUE添加到setnames中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2016-02-14
      • 1970-01-01
      • 2022-11-07
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多