【问题标题】:How to transform a data.frame Long to Wide, but not using factors and not equal length associations如何将 data.frame Long 转换为 Wide,但不使用因子和不等长关联
【发布时间】:2016-08-26 18:21:36
【问题描述】:

我尝试了一些解决方案,但它们不适合这个用例。我有 32 GB 的 RAM,但在使用 cast、dcast 或 spread 时我仍然会遇到天花板。我循环查找一个列表,我花了超过 24 小时来完成我拥有的 4200 万行中的一部分。我想要一个使用 apply 系列的基本解决方案,但我知道这是否行不通......我觉得它不会,因为我必须查询下一行以确定 addressID 是否匹配(或者 data.框架未排序,它必须搜索列的其余部分)。

这是一个(排序的)data.frame 示例:

addressID   MAKE 
104554      LINCOLN                             
104554      LINCOLN                             
104628      HYUNDAI                             
104628      TOYOTA                              
104628      SUBARU                              
104677      HYUNDAI                             
104677      HYUNDAI

我想要长格式或列表,这样我就有了:

$`104554`
[1] LINCOLN LINCOLN

$`104628`
[1] HYUNDAI TOYOTA SUBARU

$`104677`
[1] HYUNDAI HYUNDAI

我将获得一些有 6 辆车的地址。我有至少 45 辆 MAKE 的汽车,所以我不希望有 2000 万 X 50 列矩阵/data.frame dcast、cast、spread 等似乎需要进行此运行的方式(他们'由于 RAM 限制而无法工作)。我觉得这应该是一个简单的解决方案,但它逃脱了我。

【问题讨论】:

  • 不妨看看split。它将创建您在第二个代码块中的列表。像myList <- split(df, df$addressID) 这样的东西。它应该比任何重塑功能都更有效。
  • 这很好用。它在运行myList <- split(df[,"MAKE"], df$addressID) 时给出了我想要的确切输出

标签: r out-of-memory


【解决方案1】:

意志 aggregate(addressID ~ MAKE, data = df, c) 为你工作?

或者, by(df, df[,"addressID"], c) 会给你一个清单

【讨论】:

  • 如果你在 aggregate() 中翻转公式,它会起作用。超级容易...希望我能想到。也没有意识到用一列列表填充 data.frame 是多么容易......
  • by() 命令将提供更好的输出,如 by(df[,"MAKE"],df[,"addressID"],c)
  • 我进行了编辑以进行我在之前的 cmets 中提到的更改。
  • 返回以保持这篇文章的诚实。 splitaggregate 从未完成。当从 10000 行变为 100000 行时,这些例程很快就陷入了困境。我等了大约2分钟就放弃了。 by 是在 7.5 秒内操作相同的 100000 行的获胜者。
猜你喜欢
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2018-04-10
  • 2015-02-16
  • 2018-05-17
相关资源
最近更新 更多