2012-04-03 13 views
14

私は次のことに苦労しています。以下で(ビッグ)データフレームがある場合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パッケージからmeltcastで例えば、いくつかのことを試して、大きなデータセット

から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 

を次のように私は、test2testを拡大することでそれを明確にしましょう。私は最初の答えの方法を使用する場合、私は次のようになります:

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

だから私は、行612がここになりたくありません。

この問題を解決するため、私は以下の解決策を見つけました。ここでは、「一意の時間列」と「一意の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 

このコメントはどうなりますか?

これはエレガントな方法ですか、それとも良い方法がありますか?

答えて

20

使用expand.gridmerge

vals <- expand.grid(YearWeek = unique(test$YearWeek), 
        ProductID = unique(test$ProductID), 
        CustomerID = unique(test$CustomerID)) 
> merge(vals,test,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-02   1   a  9 
6 2012-02   1   b  11 
7 2012-02   2   a  10 
8 2012-02   2   b  NA 

NA sがあなたがサブセットとis.naを使用して選択したどんな値で事実後に交換することができます。

+0

+1美しい... –

+0

+1のスピードと、あなたが愛している 'expand.grid()'のスピード。私は時には 'mapply()'や 'plyr :: maply()'と組み合わせて、これら2つの関数に渡す引数の組み合わせをすべて作るためのツールとして使用しました。誰か他の人がそれをするのですか、それともより良いイディオムがありますか? –

+0

@ JoshO'Brien - それは私が過去に使ったのと同じ方法で、パフォーマンスにはとても満足しています。私は何かが滑らかに見えることをうれしく思います。 – Chase

関連する問題