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