【问题标题】:Convert factor variable to N binary variables [duplicate]将因子变量转换为N个二进制变量[重复]
【发布时间】:2017-03-23 21:02:54
【问题描述】:

我有一个如下所示的数据框

id <- c(1,1,1,2,2,2,1,3,4,4)
product <- c("a","b","c","a","d","f","e","f","e","f") 
df <- data.frame(id,product)

   id product
1   1       a
2   1       b
3   1       c
4   2       a
5   2       d
6   2       f
7   1       e
8   3       f
9   4       e
10  4       f

我想将其转换为如下数据框。

id a b c d e f
1  1 1 1 0 1 0
2  1 0 0 1 0 1
3  0 0 0 0 0 1
4  0 0 0 0 1 1

基本上,每个 id 只需要一条记录,记录应包含 0 或 1,具体取决于是否购买了产品。我使用了model.matrix,但它没有按id分组,我得到了10行,就像在原始数据集中一样。

【问题讨论】:

  • 这不应该在 StackOverflow 上吗?
  • @ashkan 我不认为它是那个的副本;这里的结果是一个关联矩阵,而不是简单地将现有的长格式重新排列为宽格式。

标签: r


【解决方案1】:

as.data.frame.table(当你 as.data.frame 一个表格时,它被称为)相当合理地将表格转换为长格式。为了防止这种情况,您需要将其视为矩阵:

 as.data.frame.matrix(table(df))
  a b c d e f
1 1 1 1 0 1 0
2 1 0 0 1 0 1
3 0 0 0 0 0 1
4 0 0 0 0 1 1

【讨论】:

    【解决方案2】:

    一个选项取决于 reshape2,还有许多其他选项可能/可能不需要一些按摩:

    > reshape2::dcast(data = df,formula = id~product,fun.aggregate = length,fill = 0L)
    Using product as value column: use value.var to override.
      id a b c d e f
    1  1 1 1 1 0 1 0
    2  2 1 0 0 1 0 1
    3  3 0 0 0 0 0 1
    4  4 0 0 0 0 1 1
    

    【讨论】:

      【解决方案3】:

      reshape 命令很灵活,类似于 PROC TRANSPOSE 及其所有特性。它将为您提供id 作为输出中的变量,缺失值是输出数据集中的未编码级别。这很容易处理并且可以反映真实数据(例如,表示负 (0) 条件的数据不存在不是输出中不存在的数据)。

      df$ind &lt;- 1

      reshape(df, direction='wide', timevar='product', idvar='id')

      给予

      > reshape(df, direction='wide', timevar='product', idvar='id')
        id ind.a ind.b ind.c ind.d ind.f ind.e
      1  1     1     1     1    NA    NA     1
      4  2     1    NA    NA     1     1    NA
      8  3    NA    NA    NA    NA     1    NA
      9  4    NA    NA    NA    NA     1     1
      

      R 可以轻松完成剩下的工作。

      aggregate 提供类似的功能:

      '聚合(df$product, df[, 'id', drop=F], table)'

      给予

      > aggregate(df$product, df[, 'id', drop=F], table)
        id x.a x.b x.c x.d x.e x.f
      1  1   1   1   1   0   1   0
      2  2   1   0   0   1   0   1
      3  3   0   0   0   0   0   1
      4  4   0   0   0   0   1   1
      

      R 可以轻松完成剩下的工作。

      【讨论】:

      • 你也可以让它更简单一些 - aggregate(product ~ id, data=df, table)aggregate(df["product"], df["id"], table) 取决于你的喜好。
      【解决方案4】:

      查看table 函数的帮助。

      table(id,product)
      

      要将其转换为数据框,请使用

      as.data.frame.matrix(table(id,product))
      

      我在Rronan 的博客文章中发现了这个提示。

      【讨论】:

      • 这不会创建所需格式的数据框。我可以使用 as.data.frame(table(id,product)),它返回 24 个 obs 和 3 个变量,但这不是我所期望的。我想要一个包含 4 个 obs 和 6 个变量的数据框。
      • 查看@Glen_b 的回答...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多