合并不同长度的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:
的 Reduce
和 merge
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_all
从 plyr
:
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))
共有三个数据集
父类别:
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:
的Reduce
和 merge
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_all
从 plyr
:
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))