重新格式化具有唯一行值作为列的数据框

时间:2019-04-08 14:40:54

标签: r

我有一个格式如下的数据框:

Order#     Product
1          Milk
1          Water
2          OJ
3          Soda
3          Lemonade

我想重新设置格式,以使每个订单有1行,每个产品为一列,并以二进制形式指示该订单是否在该列中包含该产品:

Order#     Lemonade     Milk     OJ     Soda     Water
1          0            1        0      0        1
2          0            0        1      0        0
3          1            0        0      1        0

我相信reshape2或tidyverse是我可以使用的软件包,但我不确定。对此方法的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table,因为它会更高效并且适用于更大的数据集

library(data.table)
dcast(setDT(df1), Order ~ Product, length)
#    Order Lemonade Milk OJ Soda Water
#1:     1        0    1  0    0     1
#2:     2        0    0  1    0     0
#3:     3        1    0  0    1     0

另外,如果有重复,请使用逻辑表达式更改length

dcast(setDT(df1), Order ~ Product, function(x) as.integer(length(x) > 0))

对于较小的数据集,table中的base R也很好

+(table(df1) > 0)

数据

df1 <- structure(list(Order = c(1L, 1L, 2L, 3L, 3L), Product = c("Milk", 
 "Water", "OJ", "Soda", "Lemonade")), class = "data.frame",
  row.names = c(NA, -5L))

答案 1 :(得分:1)

df$v<-1
tidyr::spread(df,Product,v,fill=0)

  Order Lemonade Milk OJ Soda Water
1     1        0    1  0    0     1
2     2        0    0  1    0     0
3     3        1    0  0    1     0