合并两个动物园对象,并为具有相同名称的列总结数据

时间:2012-08-19 08:37:41

标签: r zoo

我想合并两个动物园对象,如果列名相同,则总结数据。例如,

ZooObject1
Date A B C
1/1/2012 2 4 8
1/2/2012 1 3 9
1/3/2012 3 6 4

ZooObject2
Date D B E
1/1/2012 3 4 9
1/2/2012 2 7 2
1/3/2012 1 8 8

MergedObject
Date A B C D E
1/1/2012 2 8 8 3 9
1/2/2012 1 10 9 2 2
1/3/2012 3 14 4 1 8

在这种情况下,由于ZooObject1ZooObject2都有名为“B”的列,因此合并的zoo对象中的B列数字将是{{1}中“B”的数字之和和ZooObject1

中的“B”

任何简单的代码都可以实现这个目标吗?

2 个答案:

答案 0 :(得分:4)

计算每个输入的唯一名称和名称,然后将它们放在一起修复任何受损的名称:

both <- intersect(names(z1), names(z2))
only1 <- setdiff(names(z1), both)
only2 <- setdiff(names(z2), both)

setNames(cbind(z1[, only1], z2[, only2], z1[, both] + z2[, both]),
    c(only1, only2, both))

这至少对样本输入起作用。如果您的实际问题在某些重要方面有所不同,可能需要或可能不需要进行一些更改。

答案 1 :(得分:1)

它并不漂亮,但这可以胜任:

library(reshape2)
z <- merge(ZooObject1, ZooObject2)
z <- melt(cbind(data.frame(t=time(z)), as.data.frame(z)), id.vars="t")
z$variable <- gsub("\\..*$", "", z$variable)
z <- dcast(z, t ~ variable, fun.aggregate=sum)
z <- zoo(z[,-1], z[,1])

对于zoo个对象,时间索引必须是唯一的,因此这种方法将zoo对象转换回数据帧,时间索引为列,聚合然后将结果转换回{{1对象。这不是防弹:如果zoo个对象中的字段名称在其名称中有zoo,则会中断!