2017-06-06 9 views
1

私はマージしようとしている2つのデータフレームを持っています。最初の表は、以下のような項目とそれに関連するデータのリストである:トランザクションのアイテムの存在に基づいてデータフレームを結合する

items <- data.frame(
    item_code = c(1111, 2222, 3333, 4444), 
    item_category = c("cata","catb","catc","catd") 
) 

そして第二には、トランザクションのリストです:

transactions <- data.frame(
    tran_code = c('aaaa', 'bbbb', 'cccc', 'dddd'), 
    tran_items = c("1111,1111,2222","3333,2222","1111,4444,4444","3333") 
) 

私は、各セルにリストを含む列を作成しようとしていますアイテムが表示される取引の種類:

view(final_df) 

item_code item_category in_trans 
1111  "cata"  "aaaa,cccc" 
2222  "catb"  "aaaa,bbbb" 
3333  "catc"  "bbbb,dddd" 
4444  "catd"  "cccc" 

誰でもこれを達成する方法についての提案はありますか? splitstackshapedata.tableパッケージ使用

+0

トランザクション内の各アイテムに独自の行を与えない理由はありますか? –

+0

サマリー出力の場合、その制約は特定の状況 – jnard0ne

答えて

5

library(splitstackshape) # this will also load the 'data.table'-package 

setDT(items) 
setDT(transactions) 

items[unique(cSplit(transactions, 'tran_items', ',', 'long')), on = .(item_code = tran_items), 
     ][, .(in_trans = toString(tran_code)), by = .(item_code, item_category)] 

が与える:

item_code item_category in_trans 
1:  1111   cata aaaa, cccc 
2:  2222   catb aaaa, bbbb 
3:  3333   catc bbbb, dddd 
4:  4444   catd  cccc 

tidyverseを使用して、あなたが行うことができます:

library(dplyr) 
library(tidyr) 

items %>% 
    left_join(., transactions %>% 
       separate_rows(tran_items) %>% 
       distinct() %>% 
       group_by(tran_items = as.numeric(tran_items)) %>% 
       summarise(in_tran = toString(tran_code)), 
      by = c('item_code' = 'tran_items')) 
2

data.tableを使用すると、次のことができます。

library(data.table) 
setDT(transactions)[, .(item_code=as.numeric(unlist(strsplit(tran_items, split=",")))), 
        by=tran_code 
        ][items, on="item_code", .(item_category=unique(item_category), 
         in_trans=paste(unique(tran_code), collapse=",")), by=.EACHI] 
    item_code item_category in_trans 
1:  1111   cata aaaa,cccc 
2:  2222   catb aaaa,bbbb 
3:  3333   catc bbbb,dddd 
4:  4444   catd  cccc 

第一鎖[](行ごとにtrans_item-tran_code)、長いへのトランザクションデータを "整形"。 2番目の[]は、これをアイテムコードのアイテムdata.frameに結合してから、pasteuniqueというitem_codeでトランザクション内のアイテムをラップします。 by=.EACHIを使用すると、この操作をitem_codeレベルで実行できます。

これは、変数が要因でないことが必要であることに注意してください。私はstringsAsFactors=FALSEをあなたのデータの読み込みに使用しました。

関連する問題