转换R数据帧中的列

时间:2013-02-13 22:59:07

标签: r dataframe

我有一个表格

的交易数据的数据框
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数据时遇到了麻烦。任何指向正确方向的人都会非常感激。

编辑:输出数据框中的拼写错误。感谢朱巴。

4 个答案:

答案 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)

plyrsummarise

一起使用
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