我是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中存在的行数
感谢您提供任何帮助!
答案 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
。