1

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

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”的列,因此合并的动物园对象中 B 列的数字将是“B”中的数字和“B”中的数字之ZooObject1ZooObject2

任何简单的代码都可以实现这一点?

4

2 回答 2

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))

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

于 2012-08-19T13:22:33.100 回答
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对象。这不是防弹的:如果你的zoo对象中的字段名称.在他们的名字中,它会破坏!

于 2012-08-19T09:31:17.403 回答