2

我有一个表单交易数据的数据框

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

我尝试了各种方法,例如首先通过 transactions$transaction 对原始数据帧使用拆分,但后来我无法从结果列表中提取 sku 数据。任何指向正确方向的指针将不胜感激。

编辑:输出数据框中的错字已修复。感谢朱巴。

4

4 回答 4

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现在将是一个字符向量,而不是每个事务的列表

于 2013-02-13T23:04:46.793 回答
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
于 2013-02-13T23:07:26.757 回答
1

改为使用plyr

library(plyr)
new_trans <- ddply(
  transactions,
  .(transaction),
  transform,
  sku=paste0(sku, collapse=" ")
  )
new_trans <- unique(new_trans)
print(new_trans)
于 2013-02-13T23:05:44.193 回答
1

要添加到您的选项中,这在 base R 中也很容易aggregate

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
于 2013-02-14T02:08:02.553 回答