如何根据R中的另一个数据帧重命名数据帧的所有列?

时间:2016-07-27 23:55:01

标签: r

我是R.的新手。我正在尝试根据另一个数据框重命名数据框的列。

基本上我的数据看起来像是

DataFrame1

A    B    C   D
1    2    3   4

我有另一张看起来像这样的桌子' DataFrame2

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行错误“from:i”中不存在以下x值,其中n是DataFrame1中存在的行数

感谢您提供任何帮助!

3 个答案:

答案 0 :(得分:6)

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)]

答案 1 :(得分:0)

只需重命名基础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

如果数据帧具有相同的长度,

Replace和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

答案 2 :(得分:0)

为此我会使用“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