假设我有以下动物园对象列表:
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
我希望得到以下内容(忽略包装-它只是一个看起来像下面的动物园对象):
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
注意:我更喜欢基本的R / zoo实现。这将是 有趣的是,看到其他库也解决了这个问题。
答案 0 :(得分:1)
我们可以使用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
答案 1 :(得分:1)
使用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