转换数据框,使列出的每个唯一交易成为单行

convert data frame so that each unique transaction listed becomes a single row

我有一个这样的数据框:

        trans_id   product_id
1          1          456
2          4          223
3          1          778
4          1          774
5          5          999
6          4          123

我需要对其进行转换,以便所有 trans_id 列为一行,如下所示:

trans_id      V1       V2     V3
1            456      778   774
4            223      123
5            999

您应该添加一个辅助 ID 列。使用我的 "splitstackshape" 包中的 getanID 很容易。由于 "splitstackshape" 也加载 "data.table",因此很容易使用 dcast.data.table:

转换为宽格式
library(splitstackshape)
dcast.data.table(
  getanID(mydf, "trans_id"), 
  trans_id ~ .id, value.var = "product_id")
#    trans_id   1   2   3
# 1:        1 456 778 774
# 2:        4 223 123  NA
# 3:        5 999  NA  NA

等效的 "dplyr"+"tidyr" 方法类似于:

library(dplyr)
library(tidyr)

mydf %>%
  group_by(trans_id) %>%
  mutate(id = sequence(n())) %>%
  spread(id, product_id)

tidyr

library(tidyr)
t(df %>% spread(trans_id, product_id))

+1 @Ananda Mahto 回答 tidydplyr

基础 R 选项是

reshape(transform(df, N= ave(trans_id, trans_id, FUN=seq_along)), 
               idvar='trans_id', timevar='N', direction='wide')
#   trans_id product_id.1 product_id.2 product_id.3
#1        1          456          778          774
#2        4          223          123           NA
#5        5          999           NA           NA