假设我有一个如下所示的数据框:
df.A
A B C
x 1 3 4
y 5 4 6
z 8 9 1
我想在第二个基于列值替换第一个中的列名:
df.B
Low High
A D
B F
C G
这样我得到了:
df.A
D F G
x 1 3 4
y 5 4 6
z 8 9 1
我该怎么做?
我尝试从df.B$High
中提取向量df.B
并在names(df.A)
中使用它,但所有内容都按字母顺序排列并移过一个。此外,这仅适用于df.A
中df.B$High
中的列的顺序相对于rbind
中的元素的保留,但情况并非总是如此(在我的实际示例中,没有数字或字母方式将两个排序为相同的顺序)。所以我认为我需要一个{{1}} - 类型的参数来匹配元素,但我不确定。
谢谢!
答案 0 :(得分:3)
您可以使用 plyr 中的rename
:
library(plyr)
dat <- read.table(text = " A B C
x 1 3 4
y 5 4 6
z 8 9 1",header = TRUE,sep = "")
> new <- read.table(text = "Low High
A D
B F
C G",header = TRUE,sep = "")
> rename(dat,replace = setNames(new$High,new$Low))
D F G
x 1 3 4
y 5 4 6
z 8 9 1
答案 1 :(得分:1)
使用match
:
df.A <- read.table(sep=" ", header=T, text="
A B C
x 1 3 4
y 5 4 6
z 8 9 1")
df.B <- read.table(sep=" ", header=T, text="
Low High
A D
B F
C G")
df.C <- df.A
names(df.C) <- df.B$High[match(names(df.A), df.B$Low)]
df.C
# D F G
# x 1 3 4
# y 5 4 6
# z 8 9 1
答案 2 :(得分:1)
您可以使用df.B
的行名来玩游戏,以便更方便地查找:
rownames(df.B) <- df.B$Low
names(df.A) <- df.B[names(df.A),"High"]
df.A
## D F G
## x 1 3 4
## y 5 4 6
## z 8 9 1
答案 3 :(得分:0)
这是一种滥用factor
的方法:
f <- factor(names(df.A), levels=df.B$Low)
levels(f) <- df.B$High
f
## [1] D F G
## Levels: D F G
names(df.A) <- f
## Desired results