【问题标题】:Reformat Dataframe With Unique Row Values as Columns使用唯一行值作为列重新格式化数据框
【发布时间】:2019-04-08 23:12:34
【问题描述】:

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

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 是我可以使用的软件包,但我不确定。任何有关如何执行此操作的帮助将不胜感激。

【问题讨论】:

  • 只做table(df1)如果'Product'中有重复,那么+(table(df1) > 0)
  • 真正的数据框有 130,000 多个订单和 153 个独特的产品。 table(df1) 给了我一个错误:“尝试使用 >= 2^31 个元素制作表格”
  • 好的,你能在新的 R 会话上做 library(data.table);dcast(setDT(df1), Order# ~ Product)

标签: r


【解决方案1】:

我们可以使用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))

对于较小的数据集,base R 中的 table 也不错

+(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))

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      相关资源
      最近更新 更多