我有一种情况,我有两个不同时间段的不同数据集。虽然许多列是相同的,但有些不是。这些“不同”列是应保留的辅助数据。
我想组合这两个数据集,留下NA不存在的值。请注意,这两个表没有任何外键,不应连接,只是堆叠在一起。
示例:
data.a <- structure(list(lat = c(50L, -30L, -33L), lon = c(-40L, -30L,
-50L), mag = c(3.5, 1.1, 2.3)), .Names = c("lat", "lon", "mag"
), class = "data.frame", row.names = c(NA, -3L))
data.b <- structure(list(lat = c(44L, -30L, -33L), lon = c(-40L, -30L,
-55L), elev = c(1050, 2.4, 2.3)), .Names = c("lat", "lon", "elev"
), class = "data.frame", row.names = c(NA, -3L))
data.a
lat lon mag
50 -40 3.5
-30 -30 1.1
-33 -50 2.3
data.b
lat lon elev
44 -40 1050.0
-30 -30 2.4
-33 -55 2.3
预期结果:
lat lon mag elev
50 -40 3.5 NA
-30 -30 1.1 NA
-33 -50 2.3 NA
44 -40 NA 1050.0
-30 -30 NA 2.4
-33 -55 NA 2.3
实现这一结果的最佳方法是什么?我看到很多实用程序来执行连接,但我不确定如何执行此操作。
答案 0 :(得分:7)
或更现代的dplyr
:
dplyr::bind_rows(data.a, data.b)
## Source: local data frame [6 x 4]
##
## lat lon mag elev
## (int) (int) (dbl) (dbl)
## 1 50 -40 3.5 NA
## 2 -30 -30 1.1 NA
## 3 -33 -50 2.3 NA
## 4 44 -40 NA 1050.0
## 5 -30 -30 NA 2.4
## 6 -33 -55 NA 2.3
或data.table
:
data.table::rbindlist(list(data.a, data.b), fill=TRUE)
## lat lon mag elev
## 1: 50 -40 3.5 NA
## 2: -30 -30 1.1 NA
## 3: -33 -50 2.3 NA
## 4: 44 -40 NA 1050.0
## 5: -30 -30 NA 2.4
## 6: -33 -55 NA 2.3
或gtools
:
gtools::smartbind(data.a, data.b)
## lat lon mag elev
## 1:1 50 -40 3.5 NA
## 1:2 -30 -30 1.1 NA
## 1:3 -33 -50 2.3 NA
## 2:1 44 -40 NA 1050.0
## 2:2 -30 -30 NA 2.4
## 2:3 -33 -55 NA 2.3
或者,如果您不想使用任何套餐:
rbind_fill <- function(...) {
dfs <- list(...)
cols <- Reduce(union, lapply(dfs, colnames))
do.call(rbind, lapply(dfs, function(df) {
df_cols <- setdiff(cols, colnames(df))
df[,df_cols] <- NA
df
}))
}
rbind_fill(data.a, data.b)
## lat lon mag elev
## 1 50 -40 3.5 NA
## 2 -30 -30 1.1 NA
## 3 -33 -50 2.3 NA
## 4 44 -40 NA 1050.0
## 5 -30 -30 NA 2.4
## 6 -33 -55 NA 2.3
答案 1 :(得分:6)
尝试:
library(plyr)
rbind.fill(data.a, data.b)
lat lon mag elev
1 50 -40 3.5 NA
2 -30 -30 1.1 NA
3 -33 -50 2.3 NA
4 44 -40 NA 1050.0
5 -30 -30 NA 2.4
6 -33 -55 NA 2.3
答案 2 :(得分:4)
library(dplyr)
result <- bind_rows(data.a, data.b)
> result
Source: local data frame [6 x 4]
lat lon mag elev
1 50 -40 3.5 NA
2 -30 -30 1.1 NA
3 -33 -50 2.3 NA
4 44 -40 NA 1050.0
5 -30 -30 NA 2.4
6 -33 -55 NA 2.3