根据第二个数据帧中的值替换数据帧中的标头

时间:2014-01-06 22:32:34

标签: r dataframe

假设我有一个如下所示的数据框:

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.Adf.B$High中的列的顺序相对于rbind中的元素的保留,但情况并非总是如此(在我的实际示例中,没有数字或字母方式将两个排序为相同的顺序)。所以我认为我需要一个{{1}} - 类型的参数来匹配元素,但我不确定。

谢谢!

4 个答案:

答案 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