1

列名が同じ場合にデータを合計して、2 つの動物園オブジェクトをマージしたいと考えています。たとえば、

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 に答える