R:两个数据帧合并

时间:2014-08-11 10:34:45

标签: r matrix merge

我想合并两个数据框,但有一些行名重复。 如果两个数据框中的行名称数不同,我希望它能显示" 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 :(得分:2)

尝试:

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

答案 1 :(得分:0)

我会在data.table.people之前发布一个灵活,可扩展且有趣的解决方案。

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

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

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
相关问题