如何对动物园对象列表中的匹配元素求和?

How do I sum matching elements in a list of zoo objects?

假设我有以下动物园对象列表:

l <- list(A1=
read.zoo(data.frame(dt=c(as.Date('2010-01-02')+0:4), val1 = 1:5)),
B2=
read.zoo(data.frame(dt=c(as.Date('2010-01-03')+0:4), val1 = 11:15)),
C2=
read.zoo(data.frame(dt=c(as.Date('2010-01-05')+0:4), val1 = 21:25)))

我想总结相应的元素(具有匹配索引的元素)。我试过:

l.sum <- Reduce('+', l)

但这种方式的问题是它只对匹配的元素求和并抛出任何不匹配的元素。我需要保留所有动物园对象中不匹配的元素的总和。因此,在示例中给出以下动物园对象:

$A1
2010-01-02 2010-01-03 2010-01-04 2010-01-05 2010-01-06 
         1          2          3          4          5
$B2
2010-01-03 2010-01-04 2010-01-05 2010-01-06 2010-01-07 
        11         12         13         14         15 
$C2
2010-01-05 2010-01-06 2010-01-07 2010-01-08 2010-01-09 
        21         22         23         24         25 

我希望得到以下内容(忽略包装 - 它只是 1 个如下所示的动物园对象):

2010-01-02 2010-01-03 2010-01-04 2010-01-05 2010-01-06 
         1         13         15         38         41

2010-01-07 2010-01-08 2010-01-09 
        23         24         25 

NOTE: I would prefer a base R/zoo implementation. It would be interesting to see other libraries solve this also.

我们可以使用zoo::merge组合对象,然后rowSums添加它们。如果需要,您可以删除除最后一列以外的所有内容。

r = Reduce(merge, l)
r$result = rowSums(r, na.rm = TRUE)
#            init x[[i]].object x[[i]].object result
# 2010-01-02    1            NA            NA      1
# 2010-01-03    2            11            NA     13
# 2010-01-04    3            12            NA     15
# 2010-01-05    4            13            21     38
# 2010-01-06    5            14            22     41
# 2010-01-07   NA            15            23     38
# 2010-01-08   NA            NA            24     24
# 2010-01-09   NA            NA            25     25

使用 fill = 0 合并列表的元素,将其转换回列表,然后使用 Reduce。

Reduce("+", as.list(do.call("merge", c(l, fill = 0))))

给予:

2010-01-02 2010-01-03 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08 
         1         13         15         38         41         38         24 
2010-01-09 
        25