在R语言中合并数据列

3

我有一个情况,我有两个不同时间段的数据集。虽然许多列是相同的,但有些列不同。这些“不同”的列是辅助数据,应该保留。

我想合并这两个数据集,在值不存在的地方留下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

怎样才能实现这个结果呢?我看到有很多工具可以执行连接操作,但是我不确定该如何进行此操作。


1
只是好奇,为什么您不希望常见的经纬度数据合并? - hrbrmstr
3个回答

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接