【问题标题】:High-performance big data manipulation in RR中的高性能大数据操作
【发布时间】:2012-12-05 11:37:39
【问题描述】:

我正在处理一组列表,其中包含深度嵌套的列表,除了以下事实之外没有固定结构:

  1. 级别 1 的列表有一个名为 variations 的元素
  2. 层次结构中的所有叶数据都是数字。

例如:

list(
  list(variations = list(
    '12'   = list(x = c(a = 1))
    )),
  list(variations = list(
    '3'    = list(x = c(a = 6, b = 4)),
    'abcd' = list(x = c(b = 1), m = list(n = list(o = c(p = 1023))))
    ))
  )

我需要将列表数据结构转换为表格的熔化(每个reshape)数据帧

data.frame(
  variation = c( '12',   '3',   '3', 'abcd',    'abcd'),
  variable  = c('x.a', 'x.a', 'x.b',  'x.b', 'm.n.o.p'),
  value     = c(    1,     6,     4,      1,      1023)
  )

或其他我可以执行快速分组和过滤的数据结构。

数据结构中有数百万个节点。该集合可以有数千个条目,每个条目都有数万个变体,其中包含 2-10+ 个名称未知的叶节点。

我正在寻找有关如何以快速方式从集合中构建数据框的建议。

一种方法是在源数据上使用unlist 来展平列表,但我不确定以下内容:

  • 我应该在整个数据结构上运行unlist,这会将叶子数字节点转换为字符串(然后我需要将其解析回数字)还是应该在每个变体上使用unlist(这将使数字叶节点保持不变)?

  • 解析unlist 将创建的长名称以提取variationvariable 值而不生成太多中间值的好方法是什么?

不管unlist 是否正确,我都在想:

  • 最好是单独构建variationvariablevalue 向量还是矩阵,然后将它们组合成一个数据框,而不是逐行构建数据框?

  • 我不应该使用数据帧,而是使用另一种更快的数据结构来处理此类数据吗?无论我最终使用什么,都需要转换为数据帧,以便与plyrreshapeggplot 一起使用。

【问题讨论】:

  • 您的数据来自哪里?如果它来自 R 外部,并且您必须多次运行此转换,或者您确实有 +10M 节点,我会用 C 编写它并生成一个压缩的 save.image() 文件。并使用指定的类型和布局将其加载到 R 中,以便 plyr 和其他人可以轻松完成他们的工作。如果是一次性工作,我会在 R 中完成,然后喝杯咖啡。
  • 使用 unlist 处理您的数据需要多长时间?
  • @user1666959 数据来自 MongoDB。我需要经常这样做,是的,我计划在本地坚持。
  • @WojciechSobala 我还没有实现直接的 unlist 版本:想先获得一些关于方法的专家建议。

标签: performance r dataframe bigdata reshape2


【解决方案1】:

有一个似乎不常用的函数rapply,它递归地对列表进行操作。我不知道它有多快(基于lapply,所以可能并不可怕但并不令人惊奇),而且使用起来很棘手。但值得考虑,即使只是为了优雅。

这是一个基本的使用示例:

> rapply( test, classes="numeric", how="unlist", f=function(var) data.frame(names(var),var) )
      variations.12.x.names.var.              variations.12.x.var       variations.3.x.names.var.1       variations.3.x.names.var.2              variations.3.x.var1 
                             "a"                              "1"                              "a"                              "b"                              "6" 
             variations.3.x.var2     variations.abcd.x.names.var.            variations.abcd.x.var variations.abcd.m.n.o.names.var.        variations.abcd.m.n.o.var 
                             "4"                              "b"                              "1"                              "p"                           "1023" 

【讨论】:

  • 谢谢,Ari,我会玩这个的。
  • Ari,我不认为rapply 会有所帮助,因为它希望以相同的方式对待数据结构中的所有列表。在这种情况下,层次结构中不同位置的列表应区别对待。
  • @Sim 你能把这个逻辑写到你传递给rapply的函数中吗?也许事先用不同的属性标记它们?
  • 有趣的想法,Ari,但有成千上万种不同的数据结构变体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多