我想合并两个数据框,但有一些行名重复。 如果两个数据框中的行名称数不同,我希望它能显示" 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
我应该使用什么命令? 非常感谢你!
答案 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