2013-03-07 48 views
11

是否有一种简单的方法可以在列表中进行简单的计算?R列表中的两个列表的总和

x <- list(a=list(1:4),b=list(1:6)) 
y <- list(a=list(1:4),b=list(1:6)) 

当我尝试:

x+y 

我收到错误: 错误X + Y:非数字参数二元运算

X和Y是相同的长度,并且含有只有整数。用矩阵可以做y + x,有没有办法做到这一点与清单列表?

+0

只需用 “+” 不是'list'实现。这是因为'list'可以包含任何R对象。因此,没有不明确的方式来添加“list”的元素。 – 2013-03-07 14:42:46

回答

10

您可以使用lapply同时通过每2名列表。

lapply(seq_along(x),function(i) 
     unlist(x[i])+unlist(y[i])) 

[[1]] 
a1 a2 a3 a4 
2 4 6 8 

[[2]] 
b1 b2 b3 b4 b5 b6 
2 4 6 8 10 12 

如果X和Y不具有相同的长度,你可以这样做:

lapply(seq_len(min(length(x),length(y)),function(i) 
     unlist(x[i])+unlist(y[i])) 
+0

另一个不错的答案!,不知道lapply的这种用法,我总是在列表中使用lapply,所以元素被用在函数中,但是使用这种方式我无法获得y元素。 – Jetse 2013-03-07 14:52:01

+1

@Jetse lapply可以迭代任何列表或迭代器。但这里的解决方案是'mapply' – agstudy 2013-03-07 14:54:41

+0

选择这个答案,因为这保持我的列表结构。 – Jetse 2013-03-07 15:00:46

10

假设每个列表具有相同的结构,你可以使用mapply如下

mapply(function(x1, y1) x1[[1]]+y1[[1]], x, y) 
+0

谢谢,mapply是我一直在寻找的功能!以前不知道这个函数,只知道应用和lapply ... – Jetse 2013-03-07 14:48:52

+0

用它在我的最终数据集上,然后我发现我失去了我的列表结构,agstudy他的答案保持我的列表结构。 – Jetse 2013-03-07 14:59:49

+3

@Jetse尝试添加'SIMPLIFY = FALSE'。 – 2013-03-07 15:00:47