2017-03-03 8 views
0

私はdata.tableの初心者です。参加して列を突き止めるために検索しました。私はdata.table join then add columns to existing data.frame without re-copyスレッドを見つけましたが、それ以上は進めませんでした。参加し、中間テーブルなしでdata.tableを使用して変異させてください

私はdplyrを使用してやりたいことができますが、サイズのためにこのコードを実際のデータに実行することはできません。また前述の理由から、中間テーブルを作成することはできません。ここで

dplyr

入力

DFI = structure(list(PO_ID = c("P1234", "P1234", "P1234", "P1234", 
"P1234", "P1234", "P2345", "P2345", "P3456", "P4567"), SO_ID = c("S1", 
"S1", "S1", "S2", "S2", "S2", "S3", "S4", "S7", "S10"), F_Year = c(2012, 
2012, 2012, 2013, 2013, 2013, 2011, 2011, 2014, 2015), Product_ID = c("385X", 
"385X", "385X", "450X", "450X", "900X", "3700", "3700", "A11U", 
"2700"), Revenue = c(1, 2, 3, 34, 34, 6, 7, 88, 9, 100), Quantity = c(1, 
2, 3, 8, 8, 6, 7, 8, 9, 40), Location1 = c("MA", "NY", "WA", 
"NY", "WA", "NY", "IL", "IL", "MN", "CA")), .Names = c("PO_ID", 
"SO_ID", "F_Year", "Product_ID", "Revenue", "Quantity", "Location1" 
), row.names = c(NA, 10L), class = "data.frame") 

ルックアップテーブルを使用して自分のデータおよびソリューションです

DF_Lookup = structure(list(PO_ID = c("P1234", "P1234", "P1234", "P2345", 
"P2345", "P3456", "P4567"), SO_ID = c("S1", "S2", "S2", "S3", 
"S4", "S7", "S10"), F_Year = c(2012, 2013, 2013, 2011, 2011, 
2014, 2015), Product_ID = c("385X", "450X", "900X", "3700", "3700", 
"A11U", "2700"), Revenue = c(50, 70, 35, 100, -50, 50, 100), 
    Quantity = c(3, 20, 20, 20, -10, 20, 40)), .Names = c("PO_ID", 
"SO_ID", "F_Year", "Product_ID", "Revenue", "Quantity"), row.names = c(NA, 
7L), class = "data.frame") 

出力

DFO = structure(list(PO_ID = c("P1234", "P1234", "P1234", "P1234", 
"P1234", "P1234", "P2345", "P2345", "P3456", "P4567"), SO_ID = c("S1", 
"S1", "S1", "S2", "S2", "S2", "S3", "S4", "S7", "S10"), F_Year = c(2012, 
2012, 2012, 2013, 2013, 2013, 2011, 2011, 2014, 2015), Product_ID = c("385X", 
"385X", "385X", "450X", "450X", "900X", "3700", "3700", "A11U", 
"2700"), Revenue = c(16.6666666666667, 16.6666666666667, 16.6666666666667, 
35, 35, 35, 100, -50, 50, 100), Quantity = c(1, 1, 1, 10, 10, 
20, 20, -10, 20, 40), Location1 = c("MA", "NY", "WA", "NY", "WA", 
"NY", "IL", "IL", "MN", "CA")), .Names = c("PO_ID", "SO_ID", 
"F_Year", "Product_ID", "Revenue", "Quantity", "Location1"), row.names = c(NA, 
10L), class = "data.frame") 

ここで私はここで2つのライブラリを使用していますdplyr

を使用して私のコードです:dplyrcompare

を私は左を使用していますDFIにルックアップテーブルから新しいエントリを追加するために参加します。次に、グループ内の行数に基づいて収益と列を分割します。これは、私がグループ化されたときの数字の膨張を防ぎたいからです。私は心から任意の助けをいただければと思います

compare(DF_Generated,DFO,allowAll = TRUE) 
TRUE 

:ここ

DF_Generated <- DFI %>% 
    dplyr::left_join(DF_Lookup,by = c("PO_ID", "SO_ID", "F_Year", "Product_ID")) %>% 
    dplyr::group_by(PO_ID, SO_ID, F_Year, Product_ID) %>% 
    dplyr::mutate(Count = n()) %>% 
    dplyr::ungroup()%>% 
    dplyr::mutate(Revenue = Revenue.y/Count, Quantity = Quantity.y/Count) %>% 
    dplyr::select(PO_ID:Product_ID,Location1,Revenue,Quantity) 

は、どのように出力マッチです。

+1

私がやっていることは、左の結合と、結果の列の変更です。それにもかかわらず、私はいくつかの行を書きましょう。私はロジックを追加しました。 – watchtower

答えて

3

それは単に(で「更新参加」)DFIに列を追加するのではなく、新しいテーブルを作成する方が効率的です:

DFI[DF_Lookup, on=.(PO_ID, SO_ID, F_Year, Product_ID), 
    `:=`(newrev = i.Revenue/.N, newqty = i.Quantity/.N) 
, by=.EACHI] 

    PO_ID SO_ID F_Year Product_ID Revenue Quantity Location1 newrev newqty 
1: P1234 S1 2012  385X  1  1  MA 16.66667  1 
2: P1234 S1 2012  385X  2  2  NY 16.66667  1 
3: P1234 S1 2012  385X  3  3  WA 16.66667  1 
4: P1234 S2 2013  450X  34  8  NY 35.00000  10 
5: P1234 S2 2013  450X  34  8  WA 35.00000  10 
6: P1234 S2 2013  900X  6  6  NY 35.00000  20 
7: P2345 S3 2011  3700  7  7  IL 100.00000  20 
8: P2345 S4 2011  3700  88  8  IL -50.00000 -10 
9: P3456 S7 2014  A11U  9  9  MN 50.00000  20 
10: P4567 S10 2015  2700  100  40  CA 100.00000  40 

これはQ &のかなり自然な拡張であるにリンクOP。

iの各行によるグループのグループ; by=.EACHI.Nは、グループに含まれる行の数です。

revとqty colsを上書きする場合は、`:=`(Revenue = i.Revenue/.N, Quantity = i.Quantity/.N)を使用します。

+0

すばらしい。ありがとう。古い収入と数量をどのように取り除くのですか?私はあなたもその作品を追加することができれば感謝します。 – watchtower

+1

@watchtower '\':= \ '()'の中でそれらの名前を使うことができ、それらの列は上書きされます。 (私は通常そのように上書きすることを躊躇しています。) – Frank

+0

フランクに感謝します。非常に役に立ちます。私は '.EACHI'でスレッドを読んでいます。上記のコードで何がグループ化されているかをどのように知ることができますか?のように、私はそれが 'PO_ID'、' SO_ID'、 'F_Year'、' Product_ID'だと思いますか?もしそうなら、あなたのコードを変更して、4つの列のうち3つ、例えば 'PO_ID'、' SO_ID'、 'F_Year'だけをグループ化するにはどうしたらいいですか?私はこれが別の質問であることを知っており、私はそれのための新しいスレッドを作成することができます。私にお知らせください。 – watchtower

関連する問題