我有一个格式如下的数据框:
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是我可以使用的软件包,但我不确定。对此方法的任何帮助将不胜感激。
答案 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