假设我有数据框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等于。对不起,如果之前有人询问,如果有,我找不到它。感谢。
答案 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