我有两个数据帧。根据条件,我想在df1中添加df2中的一行。条件基本上是ID。想象一下你有df1…
ID Val1 Val2
1 1 1 3
2 2 3 2
3 3 1 2
4 4 3 4
5 5 2 3
您希望在df1中添加df2中的特定行,如下所示。。
ID A B
1 2 4 9
2 1 5 7
3 3 2 6
4 5 4 9
5 4 2 8
因此,新的数据帧应该根据ID自动匹配/合并df1和df2,请记住,我不能简单地使用cbind,因为顺序不同。
ID Val1 Val2 A B
1 1 1 3 5 7
2 2 3 2 4 9
3 3 1 2 2 6
4 4 3 4 4 9
5 5 2 3 2 8
我使用了semi_join,例如
df1 %>%
bind_rows(semi_join(df2, df1, by = "ID"))
但我得到了df2的NA。数据帧由ID连接,但A和B的值应该在哪里,只有NA,没有任何例外。我可能做错了什么,还有其他更好的解决方案吗?
我们可以使用merge
来处理的行顺序
merge(df1 , df2 , by = "ID")
- 输出
ID Val1 Val2 A B
1 1 1 3 5 7
2 2 3 2 4 9
3 3 1 2 2 6
4 4 3 4 2 8
5 5 2 3 4 9
由于您的示例使用dplyr
,因此这里有一个使用left_join
的解决方案。在类似于您的情况下,这是一种联接,您希望从df2
向df1
添加信息,同时保留df1
的格式。
当您使用联接时,不需要使用bind_rows
,而semi_join
是一种所谓的过滤联接,它不会做您想要做的事情。
library(dplyr)
df1 |>
left_join(df2)
输出:
Joining, by = "ID"
# A tibble: 5 × 5
ID Val1 Val2 A B
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 3 5 7
2 2 3 2 4 9
3 3 1 2 2 6
4 4 3 4 2 8
5 5 2 3 4 9
数据:
library(readr)
df1 <- read_table("ID Val1 Val2
1 1 3
2 3 2
3 1 2
4 3 4
5 2 3")
df2 <- read_table("ID A B
2 4 9
1 5 7
3 2 6
5 4 9
4 2 8")