r-根据条件(匹配ID)将行添加到数据帧



我有两个数据帧。根据条件,我想在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的解决方案。在类似于您的情况下,这是一种联接,您希望从df2df1添加信息,同时保留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")

相关内容

  • 没有找到相关文章

最新更新