假设我有两个列表,列表的相应元素具有相同的形状:
e1=list(1,c(1,2,3),matrix(1:12,3,4))
e2=list(1,c(1,2,3),matrix(1:12,3,4))
我希望逐个元素地添加这两个列表。这是我的解决方案,适用于任何长度的列表和任何形状的元素,只要它们匹配并且可以添加:
> esum
function(e1,e2){
e = list()
for(i in 1:length(e1)){
e[[i]]=e1[[i]]+e2[[i]]
}
e
}
> esum(e1,e2)
但它看起来很丑陋,可能是一种可以在单行中完成的事情。
这是问题的第一阶段,实际上是要添加许多这些列表的完整列表,但是一旦定义了esum,它只是减少:
> ee = list(e1,e2,e1,e1,e2)
> Reduce(esum,ee)[[3]] # lets just check [[3]] for now
[,1] [,2] [,3] [,4]
[1,] 5 20 35 50
[2,] 10 25 40 55
[3,] 15 30 45 60
那么,任何人都有这样的单线程吗?
是的,我知道单行并不总是最好的事情。
答案 0 :(得分:18)
像
这样的东西 mapply("+",e1,e2)
适用于第一部分...
Reduce( function(x,y) mapply("+",x,y),ee)[[3]]
可能有些东西更加光滑。 Reduce
没有...
参数,因此我们无法逃脱Reduce(mapply,ee,FUN="+")[[3]]
答案 1 :(得分:0)
怎么样: esum< - unlist(e1)+ unlist(e2)
你必须'重建'你的列表结构,如果你总是拥有相同的结构,这很容易,如果你处理任意结构,将只需要一些工作。
啊,忘掉它吧。mapply('+',...)
解决方案更好,打败了我。