合并多个数据帧而不会出现重复数据

时间:2014-12-09 22:58:57

标签: r merge

我正在尝试通过ID将6个以上的数据集合并为一个。现在,ID的重复使得合并将每个ID视为新的观察。

示例代码:

combined <-Reduce(function(x,y) merge(x,y, all=TRUE), list(NRa,NRb,NRc,NRd,NRe,NRf,NRg,NRh))

这给了我这个:

        ID Segment.h Segment.g Segment.f Segment.e Segment.d Segment.c
1 62729107        NA        NA        NA        NA        NA        1
2 62734839        NA         1        NA        NA        1         NA
3 62734839        NA        NA        NA        1         NA        NA
4 62737229        NA        1         NA        NA        NA        NA
5 62737229        NA        NA        NA        1         1         NA

我希望每个ID都有一行:

         ID Segment.h Segment.g Segment.f Segment.e Segment.d Segment.c
1 62729107        NA        NA        NA        NA        NA        1
2 62734839        NA        1         NA        1         1         NA
3 62737229        NA        1         NA        1         1         NA

感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

使用R的sqldf包可以让你每行只有一个id。

Data1 <- data.frame(
  X = sample(1:10),
  Housing = sample(c("yes", "no"), 10, replace = TRUE)
)
Data2 <- data.frame(
  X = sample(1:10),
  Credit = sample(c("yes", "no"), 10, replace = TRUE)
)
Data3 <- data.frame(
  X = sample(1:10),
  OwnsCar = sample(c("yes", "no"), 10, replace = TRUE)
)
Data4 <- data.frame(
  X = sample(1:10),
  CollegeGrad = sample(c("yes", "no"), 10, replace = TRUE)
)

library(sqldf)
sqldf("Select Data1.X,Data1.Housing,Data2.Credit,Data3.OwnsCar,Data4.CollegeGrad from Data1 
      inner join Data2 on Data1.X = Data2.X
      inner join Data3 on Data1.X = Data3.X
      inner join Data4 on Data1.X = Data4.X
      ")

答案 1 :(得分:0)

为什么不在by='ID'函数中尝试merge()。如果这还不够,请尝试aggregate()

答案 2 :(得分:0)

您对问题的描述并不完全清楚,并且您无法提供数据。

假设您的所有数据框具有相同的维度,列名称,列顺序,ID条目,ID行顺序匹配,该ID是第一列,所有其他条目都是NA或1以及任何单元格在一个具有1的数据帧中,对于所有其他数据帧,该单元格中的NA值或者数值的总和是可接受的,并且您希望将结果作为数据帧...

使用abind包的老派解决方案:

consolidate <- function(lst) {

    stopifnot(require(abind))

    ## form 3D array, replace NA
    x <- abind(lst, along=3)
    x[is.na(x)] <- 0

    z <- x[,,1] ## data store

    ## sum array along 3rd dimension
    for (j in seq(2,ncol(x)))
        for (i in seq(nrow(x)))
            z[i,j] <- sum(x[i,j,])

    z[z==0] <- NA ## restore NA

    as.data.frame(z)
}

对于数据框(具有上述警告)a,b,c:

consolidate(list(a,b,c))