【问题标题】:R Transpose A column into a Binary RowR将A列转置为二进制行
【发布时间】:2014-10-12 11:15:57
【问题描述】:

对于“一条记录”,我有一个看起来像这样的数据列 可能有数百甚至数千条记录,其中每条记录都有不同的 ID,但有许多不同的属性 ColName2 我想转置表格,使其看起来像表格 2 这在 R 中可能吗?在 Rapid-miner 中是可能的,但我想在 R 中实现它

我有什么表 1

  • ID ColName2
  • 1A 项目1
  • 1A 物品2
  • 1A 物品3
  • 1A 物品4
  • 2A 项目5

我想要什么 - 表 2

  • ID 项目1 项目2 项目3 项目4 项目5
  • 1A 1 1 1 1 0
  • 2A 0 0 0 0 1

谢谢

【问题讨论】:

    标签: sql r transpose


    【解决方案1】:

    您可以为此使用reshape2,例如:

    > df <- data.frame(ID = c(rep("1A", 4), "2A"), ColName = 1:5)
    > df
    #  ID ColName
    #1 1A       1
    #2 1A       2
    #3 1A       3
    #4 1A       4
    #5 2A       5
    
    library(reshape2)
    
    > df2 <- dcast(df, ID ~ ColName, fun.aggregate = any, value.var = "ColName")
    

    这次重塑的结果是:

      ID     1     2     3     4     5
    1 1A  TRUE  TRUE  TRUE  TRUE FALSE
    2 2A FALSE FALSE FALSE FALSE  TRUE
    

    所以你有逻辑值(你想要 1 的地方是 TRUE,你想要 0 的地方是 FALSE)。由于您可以将逻辑值转换为数字,其中 TRUE == 1 和 FALSE == 0,您只需将所有列(第一列除外)转换为数字。为此,您可以在除第一列(由 df2[-1] 指示)之外的 data.frame 上使用 lapply,并将函数 as.numeric 应用于其他每一列:

    > df2[-1] <- lapply(df2[-1], as.numeric)
    > df2
    #  ID 1 2 3 4 5
    #1 1A 1 1 1 1 0
    #2 2A 0 0 0 0 1
    

    lapply 如果您想将函数应用于 data.frame 的所有列或列表中的所有元素,通常非常有用。如需更多信息,请查看?lapplythis question

    【讨论】:

    • 感谢@beginneR 的快速回复。你能向我解释一下 df2[-1] 行发生了什么吗
    • @JohnSmith,我添加了一个解释。希望这可以帮助您了解正在发生的事情:)
    • 完美,非常感谢。我收到一个错误“Summary.factor 中的错误(整数(0),na.rm = FALSE):任何对因子都没有意义”,但我能够运行您的代码,它让我朝着正确的方向前进
    • @JohnSmith,在这种情况下尝试df2 &lt;- dcast(df, ID ~ ColName, value.var = "ColName"),然后尝试df2[-1] &lt;- lapply(df2[-1], function(x) as.numeric(!is.na(x)))。这行得通吗?
    • 是的......完美......再次感谢,如果没有你的帮助,我会一直在这里直到圣诞节
    猜你喜欢
    • 2023-02-03
    • 2021-11-14
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2021-09-09
    相关资源
    最近更新 更多