2015-09-10 28 views

回答

3

一種選擇將是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)  

    }) 
3

如下您可以用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() 
+0

併爲plyr老式的,還有'rbind.fill'代替''bind_rows',或'rbindlist(list(l1,l2),fill = TRUE)'from data.table。 – Frank

+0

在* dplyr *,dplyr_0.4.3的當前版本中,您可以將列表直接提供給'bind_rows'而不將其轉換爲數據框 - 即'bind_rows(l1,l2)'。 – aosmith

0

稍微不同的方法,

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 
相關問題