首页 文章

R:两个数据帧合并

提问于
浏览
1

我想合并两个数据框,但有一些行名称重复 . 如果两个数据框中的行名称数不同,我希望它可以在较少的一列中显示“NA” .

我的例子:

test1 <- data.frame(name = c("A", "B", "C", "C", "C", "D"), n1 = c("15", "14", "13", "12", "11", "10"))
test2 <- data.frame(name = c("A", "B", "B", "C", "C", "D"), n1 = c("30", "31", "33", "39", "38", "40"))

然后我按名称合并,我得到了

名字n1.x n1.y A 15 30
B 14 31
B 14 33
C 13 39
C 13 38
C 12 39
C 12 38
C 11 39
C 11 38
D 10 40

它会重复我想要的

名字n1.x n1.y A 15 30
B 14 31
B NA 33
C 13 39
C 12 38
C 11 NA
D 10 40

我应该使用什么命令?非常感谢你!

2 回答

  • 0

    尝试:

    test1$indx <- with(test1, ave(1:nrow(test1), name, FUN=seq_along))
    test2$indx <- with(test2, ave(1:nrow(test2), name, FUN=seq_along))
    merge(test1, test2, by=c("name","indx"),all=T)[,-2]
     #   name n1.x n1.y
    # 1    A   15   30
    # 2    B   14   31
    # 3    B <NA>   33
    # 4    C   13   39
    # 5    C   12   38
    # 6    C   11 <NA>
    # 7    D   10   40
    
  • 2

    我将在 data.table.people 之前发布一个灵活,可扩展和quicl解决方案 .

    请注意,这适用于提供的数据集 . 您应该仔细检查 生产环境 代码的结果 .

    以下代码的作用是将共同级别的值粘在一起 . 其余的只是簿记 .

    ml <- vector("list", length(unique(test1$name)))
    names(ml) <- unique(test1$name)
    
    for (i in unique(test1$name)) {
      o1 <- test1[test1$name %in% i, , drop = FALSE]
      o2 <- test2[test2$name %in% i, , drop = FALSE]
      o.max <- max(c(nrow(o1), nrow(o2)))
      nc <- ifelse(o.max == 1, 2, o.max*2)
      out <- matrix(rep(NA, times = nc), nrow = nc/2)
      out[1:nrow(o1), 1] <- as.numeric(as.character(o1$n1))
      out[1:nrow(o2), 2] <- as.numeric(as.character(o2$n1))
    
      ml[[i]] <- out
    }
    
    count.each <- sapply(ml, nrow)
    result <- do.call("rbind", ml)
    colnames(result) <- c("n1.x", "n1.y")
    data.frame(name = rep(names(ml), count.each), result)
    
      name n1.x n1.y
    1    A   15   30
    2    B   14   31
    3    B   NA   33
    4    C   13   39
    5    C   12   38
    6    C   11   NA
    7    D   10   40
    

相关问题