我有以下列表:R:將不同長度的多個列表中的項目加在一起?
l1 <- list(a = 3, b = 4, c = 8, d = 1)
l2 <- list(a = 3, b = 2, c = 5, d = 1, f = 4, g = 13)
如何總結的基礎上他們的名字都列出了項目合併兩個列表,如:
l1 + l2 = list(a=6, b=6, c=13, d=2, f=4, g=13)
我有以下列表:R:將不同長度的多個列表中的項目加在一起?
l1 <- list(a = 3, b = 4, c = 8, d = 1)
l2 <- list(a = 3, b = 2, c = 5, d = 1, f = 4, g = 13)
如何總結的基礎上他們的名字都列出了項目合併兩個列表,如:
l1 + l2 = list(a=6, b=6, c=13, d=2, f=4, g=13)
一種選擇將是melt
兩個list
s到data.frame,merge
他們,在數字列上執行rowSums
並將其轉換回list
。
library(reshape2)
d1 <- merge(melt(l1), melt(l2), by='L1', all=TRUE)
setNames(as.list(rowSums(d1[-1], na.rm=TRUE)), d1$L1)
#$a
#[1] 6
#$b
#[1] 6
#$c
#[1] 13
#$d
#[1] 2
#$f
#[1] 4
#$g
#[1] 13
或者我們同時創建 'L1' 和 'L2'( 'NM1')的獨特names
。循環'nm1',replace
NULL元素爲0,並執行+
。
nm1 <- union(names(l1), names(l2))
lapply(nm1, function(x) {v1 <- l1[[x]]
v2 <- l2[[x]]
replace(v1, is.null(v1), 0) +
replace(v2, is.null(v2), 0)
})
如下您可以用dplyr
來解決:
l1 <- list(a = 3, b = 4, c = 8, d = 1)
l2 <- list(a = 3, b = 2, c = 5, d = 1, f = 4, g = 13)
library(dplyr)
bind_rows(lapply(list(l1, l2), as.data.frame)) %>%
colSums(na.rm=TRUE) %>%
as.list()
稍微不同的方法,
l1 <- list(a = 3, b = 4, c = 8, d = 1)
l2 <- list(a = 3, b = 2, c = 5, d = 1, f = 4, g = 13)
a <- l1[intersect(names(l1), names(l2))]
b <- l2[intersect(names(l1), names(l2))]
ab <- as.numeric(a) + as.numeric(b)
c <- as.numeric(l1[!(l1 %in% a)])
d <- as.numeric(l2[!(l2 %in% b)])
c(ab, c, d)
# [1] 6 6 13 2 4 13
併爲plyr老式的,還有'rbind.fill'代替''bind_rows',或'rbindlist(list(l1,l2),fill = TRUE)'from data.table。 – Frank
在* dplyr *,dplyr_0.4.3的當前版本中,您可以將列表直接提供給'bind_rows'而不將其轉換爲數據框 - 即'bind_rows(l1,l2)'。 – aosmith