簡體   English   中英

R:兩個數據幀合並

[英]R: two data frame 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 

我應該使用什么命令? 非常感謝你!

嘗試:

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

我將在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM