【问题标题】:R speeding up calculation process on 2.5million obsR 加速了 250 万个 obs 的计算过程
【发布时间】:2014-02-10 16:34:20
【问题描述】:

我有一个巨大的 data.frame(200 万块),我在其中根据一个相同的列值计算多个列值的总和,如下所示(首先转换为 data.table):

check <- dt[,sumOB := (sum(as.numeric(as.character(OB))), by = "BIK"]

这为我提供了一个新列,其中包含具有相同 BIK 的多个值(如果适用)的总和值。在我添加以下计算之后。

calc <- check[,NewVA := (((as.numeric(as.character(VA)))
/ sumOB) * (as.numeric(as.character(OB)))), by = ""]

这工作得很好,给了我一个包含所需值的新列。我的数据框包含上述 200 万个观察值,这个过程非常缓慢且内存密集(我有 8GB 的​​内存,我使用了所有内存)。

我想加快这个过程,有没有更有效的方法来达到同样的结果?

提前致谢,

罗伯特

【问题讨论】:

  • 给一个可重现的例子和一个人们可以扔代码的测试怎么样?
  • 我建议使用示例数据(大约 10k 个对象)对您的代码进行分析。我认为类型转换是瓶颈。
  • @ArtemKlevtsov 不,在内存中复制一个巨大的数据结构是瓶颈。
  • 为了制作一个可重现的示例,一个具有 3 列和 250 万行随机值(范围为 150000 : 850000)的简单矩阵就足够了。明天我将尝试使用 FREAD 摆脱 as.XXX 的

标签: r data.table performance


【解决方案1】:

我不明白您为什么将所有内容都包装在 as.numeric(as.character(...)) 中。这是您不应该需要的性能成本。

你为什么要复制你的data.table?那是你最大的错误。看看

dt[,sumOB := (sum(as.numeric(as.character(OB))), by = "BIK"] 
dt[,NewVA := 
  (((as.numeric(as.character(VA))) / sumOB) * (as.numeric(as.character(OB))))]      
print(dt)

(可能没有所有类型转换)。

【讨论】:

  • 如果我不得不猜测,类型转换来自不应该成为因素的因素,当然他们需要在数据导入时修复。
  • @joran 这也是我的猜测。但如果他使用fread 进行数据导入(他应该这样做),这应该不是问题。
  • 哇...fread(来自data.table 包)太神奇了。对于大型 csv 文件,我的 IO 性能比 read.table 有了非常显着的提升。谢谢@Roland!!!
  • 这正是因为它们是作为因子导入的(是的,它们不应该是)。我不是导入数据的人,我收到了 .Rdata,将与他联系并在明天回复。我复制了 data.tables,因为我需要检查每一步。我可以删除额外 data.tables 的创建,但我看不出这将如何加快进程。
  • @Arun 好吧,我们不确定正在读取的原始文件中到底有什么。通常,人们会无意中读到他们“认为”是数字的列,但实际上在单个值中包含一些杂散字符,会弄乱一切。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2018-12-05
  • 2019-06-28
相关资源
最近更新 更多