我有一个表格
的交易数据的数据框transactions <- data.frame(transaction=c("T1","T2","T2","T3","T3","T3"),sku=c("item_a","item_b","item_c","item_a","item_b","item_d"))
给了我这个
transaction sku
1 T1 item_a
2 T2 item_b
3 T2 item_c
4 T3 item_a
5 T3 item_b
6 T3 item_d
我希望得到的输出是这个数据框:
output <- data.frame(transaction=c("T1","T2","T3"),sku=c("item_a","item_b item_c","item_a item_b item_d"))
看起来像这样
transaction sku
1 T1 item_a
2 T2 item_b item_c
3 T3 item_a item_b item_d
我尝试了各种方法,例如首先在事务$ transaction上对原始数据框使用 split ,但是我在结果列表中提取sku数据时遇到了麻烦。任何指向正确方向的人都会非常感激。
编辑:输出数据框中的拼写错误。感谢朱巴。
答案 0 :(得分:4)
使用data.table
非常简单,它有一种打印列表列的好方法
library(data.table)
DT <- data.table(transactions)
DT[,list(sku = list(sku)) ,by=transaction]
## transaction sku
## 1: T1 item_a
## 2: T2 item_b,item_c
## 3: T3 item_a,item_b,item_d
如果你想将它们粘贴在一起,你也可以
DT <- data.table(transactions)
DT[,list(sku = paste(sku, collapse = ', ')) ,by=transaction]
transaction sku
1: T1 item_a
2: T2 item_b,item_c
3: T3 item_a,item_b,item_d
sku
现在是一个字符向量,而不是每个事务的列表
答案 1 :(得分:2)
将plyr
与summarise
require(plyr)
ddply(transactions, .(transaction), summarise, sku=paste(sku, collapse = " "))
# transaction sku
# 1 T1 item_a
# 2 T2 item_b item_c
# 3 T3 item_a item_b item_d
答案 2 :(得分:1)
改为使用plyr
:
library(plyr)
new_trans <- ddply(
transactions,
.(transaction),
transform,
sku=paste0(sku, collapse=" ")
)
new_trans <- unique(new_trans)
print(new_trans)
答案 3 :(得分:1)
要添加到您的选项中,使用aggregate
的基础R也很容易:
aggregate(sku ~ transaction, transactions, paste, collapse = " ")
transaction sku
1 T1 item_a
2 T2 item_b item_c
3 T3 item_a item_b item_d