私は次のことに苦労しています。以下で(ビッグ)データフレームがある場合R:時間関連のデータフレームに見つからない(存在しない/存在しない)行を見つけて追加します。
:列の組合せは、「ユニークな」組み合わせをしているため
- いくつかの列を、ID
- 時間関連のコラム
- 言います測定関連列
各時間間隔の一意のIDごとに、データフレームでメジャーを使用できることを確認します。そうでない場合は、その時間/ IDに0(またはNA)メジャーを追加します。
は以下test
データフレームを作成し、問題を説明するために:
test <- data.frame(
YearWeek =rep(c("2012-01","2012-02"),each=4),
ProductID =rep(c(1,2), times=4),
CustomerID =rep(c("a","b"), each=2, times=2),
Quantity =5:12
)[1:7,]
YearWeek ProductID CustomerID Quantity
1 2012-01 1 a 5
2 2012-01 2 a 6
3 2012-01 1 b 7
4 2012-01 2 b 8
5 2012-02 1 a 9
6 2012-02 2 a 10
7 2012-02 1 b 11
8行目は、目的に、除外されています。このようにして、ID値「2-b」(ProductID-CustomerID
)の「欠損値」(Quantity
)を時間値「2012-02」にシミュレートします。
私がしたいのは、すべての時間値(これらは、この例では「2012-01」と「2012-02」)に対応するようにdata.frameを調整することです。 (これは前もって知られていませんが、これは「データフレーム内のすべての一意のIDの組み合わせ」、つまりID列のユニークなセットです)、データフレームで数量が利用可能です。
これは、この例(私たちは欠損値のためNA
を選択した場合、一般的に、私はその上のコントロールを持ちたい)のためになるはずである:
YearWeek ProductID CustomerID Quantity
1 2012-01 1 a 5
2 2012-01 2 a 6
3 2012-01 1 b 7
4 2012-01 2 b 8
5 2012-02 1 a 9
6 2012-02 2 a 10
7 2012-02 1 b 11
8 2012-02 2 b NA
究極の目標は、これらのIDの組み合わせのために時系列を作成することで、私はすべての時間価値のために量を持っていたいと思う。私は(時間)別の集計を行うと、私はreshape
パッケージからmelt
とcast
で例えば、いくつかのことを試して、大きなデータセット
からIDの異なるレベルを使用する必要があります。しかし、これまで私はそれをすることはできませんでした。次のステップはforループなどで関数を作成することですが、それはパフォーマンスの観点からはあまり役に立ちません。
おそらく、時系列をすぐに作成して、test
のようなdata.frameを与える方が簡単な方法があります。誰にもこのアイデアはありますか?
ありがとうございます!
実際の問題では、2つ以上の「ID列」があることに注意してください。
編集:私は、問題をさらに説明する必要があり
。 「時間」列と「ID」列には違いがあります。 joranの質問の最初の(そして大きな!)答えは、私が望むものから明確な理解を得られなかったかもしれません。
(これらは先行知られているが、これは「データ・フレーム内のすべての 固有IDの組み合わせ」 IDカラム上従って固有のセットであるれていない)すべてのID-組み合わせについて:私は上に述べました
私は「すべてのIDの組み合わせ」ではなく「データ内のすべてのIDの組み合わせ」を望んでいます。 これらの組み合わせのそれぞれに対して、私は一意の時間値ごとに値を求めます。
この組み合わせはtest2
内にないので、私は、結果のデータフレームにNO「3-B」IDの組み合わせを必要ないことを意味> test2 <- rbind(test, c("2012-02", 3, "a", 13)) > test2 YearWeek ProductID CustomerID Quantity 1 2012-01 1 a 5 2 2012-01 2 a 6 3 2012-01 1 b 7 4 2012-01 2 b 8 5 2012-02 1 a 9 6 2012-02 2 a 10 7 2012-02 1 b 11 8 2012-02 3 a 13
を次のように私は、
test2
にtest
を拡大することでそれを明確にしましょう。私は最初の答えの方法を使用する場合、私は次のようになります:> vals2 <- expand.grid(YearWeek = unique(test2$YearWeek), ProductID = unique(test2$ProductID), CustomerID = unique(test2$CustomerID)) > merge(vals2,test2,all = TRUE) YearWeek ProductID CustomerID Quantity 1 2012-01 1 a 5 2 2012-01 1 b 7 3 2012-01 2 a 6 4 2012-01 2 b 8 5 2012-01 3 a <NA> 6 2012-01 3 b <NA> 7 2012-02 1 a 9 8 2012-02 1 b 11 9 2012-02 2 a 10 10 2012-02 2 b <NA> 11 2012-02 3 a 13 12 2012-02 3 b <NA>
だから私は、行
6
と12
がここになりたくありません。この問題を解決するため、私は以下の解決策を見つけました。ここでは、「一意の時間列」と「一意のIDの組み合わせ」を分割します。したがって、上記との違いは「組み合わせ」という単語であり、すべてのID列で一意ではありません。
> temp_merge <- merge(unique(test2["YearWeek"]), unique(test2[c("ProductID", "CustomerID")])) > merge(temp_merge,test2,all = TRUE) YearWeek ProductID CustomerID Quantity 1 2012-01 1 a 5 2 2012-01 1 b 7 3 2012-01 2 a 6 4 2012-01 2 b 8 5 2012-01 3 a <NA> 6 2012-02 1 a 9 7 2012-02 1 b 11 8 2012-02 2 a 10 9 2012-02 2 b <NA> 10 2012-02 3 a 13
このコメントはどうなりますか?
これはエレガントな方法ですか、それとも良い方法がありますか?
+1美しい... –
+1のスピードと、あなたが愛している 'expand.grid()'のスピード。私は時には 'mapply()'や 'plyr :: maply()'と組み合わせて、これら2つの関数に渡す引数の組み合わせをすべて作るためのツールとして使用しました。誰か他の人がそれをするのですか、それともより良いイディオムがありますか? –
@ JoshO'Brien - それは私が過去に使ったのと同じ方法で、パフォーマンスにはとても満足しています。私は何かが滑らかに見えることをうれしく思います。 – Chase