合并R中的数据列

时间:2015-09-16 01:39:27

标签: r dataframe

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

我想组合这两个数据集,留下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

实现这一结果的最佳方法是什么?我看到很多实用程序来执行连接,但我不确定如何执行此操作。

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