我想合并两个动物园对象,如果列名相同,则总结数据。例如,
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
在这种情况下,由于ZooObject1
和ZooObject2
都有名为“B”的列,因此合并的zoo对象中的B列数字将是{{1}中“B”的数字之和和ZooObject1
任何简单的代码都可以实现这个目标吗?
答案 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
,则会中断!