合并不同长度的R数据帧

Merge R data frames with differing lengths

共有三个数据集

父类别:

ID 
Ants
Cow
Dog
Hen
Tiger

df1:

ID     Number1
Ants    6
Dog     2
Hen     7

df2:

ID     Number2
Ants    5
Cow     7
Tiger   3

最终数据 (df3) 应如下所示:

ID      Number1  Number2
Ants       6        5
Cow        0        7
Dog        2        0
Hen        7        0
Tiger      0        3

有没有直接的方法可以在 R 中实现这一点。我可以通过手动方式来尝试找出缺失值,然后在每一行中输入它并将其分配给 0,然后将其排列在升序。最后,我会将两个数据框合并为一个。但是我们是否可以创建一个函数来为我们完成所有这些工作,甚至有两个以上的数据集。

我找到了解决办法,

但这花费了很多时间 运行 并显示错误 错误:无法分配大小为 46.0 MB 的矢量

您可以使用 dplyr 中的 full_join :

full_join(df1, df2, "ID") %>% replace_NA(0)

您的数据:

library(dplyr)
library(collapse)

df1 <- data.frame(ID = c("Ants", "Dog", "Hen"), Number1 = c(6,2,7))
df2 <- data.frame(ID = c("Ants", "Cow", "Tiger"), Number2 = c(5,7,3))

full_join(df1, df2, "ID") %>% replace_NA(0) %>% arrange(ID)

我们可以将所有数据帧放入一个列表中,并使用来自基础 R:

Reducemerge
df <- Reduce(function(...) merge(..., by='ID', all.x=TRUE), list(parent, df1, df2))
df[is.na(df)] <- 0 

     ID Number1 Number2
1  Ants       6       5
2   Cow       0       7
3   Dog       2       0
4   Hen       7       0
5 Tiger       0       3

或者我们可以使用 join_allplyr:

library(plyr)
join_all(list(parent, df1, df2), by='ID', type='left') %>% 
  replace(is.na(.), 0)

purrr::reduce:

library(tidyverse)

reduce(list(parent, df1, df2), left_join, by = 'ID') %>% 
  mutate(across(where(is.numeric), ~ replace_na(.x, 0)))

数据

parent <- structure(list(ID = c("Ants", "Cow", "Dog", "Hen", "Tiger")), 
                    class = "data.frame", row.names = c(NA, -5L))

df1 <- structure(list(ID = c("Ants", "Dog", "Hen"), 
                      Number1 = c(6L, 2L, 7L)), 
                 class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(ID = c("Ants", "Cow", "Tiger"), 
                      Number2 = c(5L, 7L, 3L)), 
                 class = "data.frame", row.names = c(NA, -3L))