R 根据事务中的项目存在情况连接数据帧

R 根据事务中的项目存在情况连接数据帧,r,join,merge,dplyr,R,Join,Merge,Dplyr,我有两个试图合并的数据帧。第一个表是项目和相关数据的列表,例如: items <- data.frame( item_code = c(1111, 2222, 3333, 4444), item_category = c("cata","catb","catc","catd") ) 有人能提供如何实现这一点的建议吗?使用splitstackshape和data.table软件包: library(splitstackshape) # this will also load t

我有两个试图合并的数据帧。第一个表是项目和相关数据的列表,例如:

items <- data.frame(
  item_code = c(1111, 2222, 3333, 4444),
  item_category = c("cata","catb","catc","catd")
  )
有人能提供如何实现这一点的建议吗?

使用splitstackshape和data.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)]
给出:

使用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'))
使用splitstackshape和data.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)]
给出:

使用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'))
使用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
第一个链[]将事务数据重塑为长的,每行一个事务项事务代码。第二个[]将其连接到items code上的items data.frame,然后使用paste和unique按item_代码包装事务中的项目。使用by=.EACHI允许在item_代码级别执行此操作

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

使用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
第一个链[]将事务数据重塑为长的,每行一个事务项事务代码。第二个[]将其连接到items code上的items data.frame,然后使用paste和unique按item_代码包装事务中的项目。使用by=.EACHI允许在item_代码级别执行此操作


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

是否有理由不让交易中的每个项目都有自己的行?这是为了汇总输出,约束只是由于特定的情况。是否有理由不让交易中的每个项目都有自己的行?这是为了汇总输出,这种限制是由于特定的情况造成的