根据事务中的项目存在加入数据框

时间:2017-06-06 18:38:47

标签: r join merge dplyr

我有两个数据框正在尝试合并。第一个表是项目列表和相关数据,例如:

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"

任何人都可以提供有关如何实现这一目标的建议吗?

2 个答案:

答案 0 :(得分:5)

使用splitstackshapedata.table套餐:

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

答案 1 :(得分: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

第一个链[]&#34;重塑&#34;事务数据为long,(每行一个trans_item-tran_code)。第二个[]将此项连接到项目代码上的项目data.frame,然后使用pasteunique按item_code包装事务中的项目。使用by=.EACHI允许在item_code级别上执行此操作。

请注意,这要求您的所有变量都不是因素。我在阅读您的数据时使用了stringsAsFactors=FALSE