Как суммировать совпадающие элементы в списке объектов зоопарка? - PullRequest
0 голосов
/ 12 апреля 2019

Предположим, у меня есть следующий список объектов зоопарка:

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 

ПРИМЕЧАНИЕ. Я бы предпочел базовую реализацию R / zoo. Это было бы интересно, что другие библиотеки решают и это.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

объединить элементы списка, используя 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 
1 голос
/ 12 апреля 2019

Мы можем использовать 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
...