通过将列与另一个数据框中的列匹配,在数据框中创建新列

时间:2014-06-07 23:49:08

标签: r

假设我有数据框df1:

df1
    R1
1   A
2   B
3   C
4   D
5   E
6   F
7   G
8   H

另一个数据框df2:

df2
    R1  R2
1   A   2
2   B   5
3   D   7
4   E   9
5   F   12
6   J   16

我如何在名为R2的df1中创建一个新列,根据df2 $ R1的匹配条目,将df2 $ R2中的正确值归为df1 $ R2?我试图这样做的任何方式我最终得到与长度差异有关的错误。但是,有没有办法可以将df2 $ R2中的值强制转换为df1中的新列,并且在df1中的任何行中只有NAs(或NaN或其他),而df2 $ R1中不存在相应的值?并且还忽略了df2中df1中没有对应行的条目(例如,第6行,其中R1 = J,因为df1 $ R1中没有J)。对于我的例子,我想要的数据集如下所示:

    R1  R2
1   A   2
2   B   5
3   C   NA
4   D   7
5   E   9
6   F   12
7   G   NA
8   H   NA

所以基本上,如果df2 $ R1与df1 $ R1相同,则df1 $ R2应等于df2 $ R2等于。对不起,如果之前有人询问,如果有,我找不到它。感谢。

2 个答案:

答案 0 :(得分:2)

merge使用all.x(或all.y)参数执行此操作,以指示使用其中一个输入的所有行:

merge(df1, df2, all.x=TRUE)
##   R1 R2
## 1  A  2
## 2  B  5
## 3  C NA
## 4  D  7
## 5  E  9
## 6  F 12
## 7  G NA
## 8  H NA

答案 1 :(得分:1)

这是match功能的任务。它的主要用途是生成与“[”函数一起使用的适当索引,即用于选择其他元素或行。这是merge操作中的一项关键功能,但完整的merge并不是您所要求的:

 df1 <- read.table(text="R1
 1   A
 2   B
 3   C
 4   D
 5   E
 6   F
 7   G
 8   H", header=TRUE)
 df2<- read.table(text=" R1  R2
 1   A   2
 2   B   5
 3   D   7
 4   E   9
 5   F   12
 6   J   16", header=TRUE)
 df1$R2 <- df2$R2[ match(df1$R1, df2$R1) ]
 df1
#-----------
  R1 R2
1  A  2
2  B  5
3  C NA
4  D  7
5  E  9
6  F 12
7  G NA
8  H NA