我有两个数据框正在尝试合并。第一个表是项目列表和相关数据,例如:
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"
任何人都可以提供有关如何实现这一目标的建议吗?
答案 0 :(得分:5)
使用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)]
给出:
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,然后使用paste
和unique
按item_code包装事务中的项目。使用by=.EACHI
允许在item_code级别上执行此操作。
请注意,这要求您的所有变量都不是因素。我在阅读您的数据时使用了stringsAsFactors=FALSE
。