R加快250万obs的计算过程

R加快250万obs的计算过程,r,data.table,performance,R,Data.table,Performance,我有一个巨大的data.frame(200万obs.),其中我基于一个相同的列值计算多个列值的总和,如下所示(首先转换为data.table): 检查我不明白你为什么把所有东西都包装成.numeric(as.character(…)。这是您不需要的性能成本 还有,为什么要复制data.table?那是你最大的错误。看 dt[,sumOB := (sum(as.numeric(as.character(OB))), by = "BIK"] dt[,NewVA := (((as.numeri

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


检查我不明白你为什么把所有东西都包装成.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)

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

我不明白为什么要将
中的所有内容都包装为.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)

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

给出一个可复制的示例和一个测试,人们可以对其抛出代码。我建议使用示例数据(大约10k个对象)分析您的代码。我认为类型转换是一个瓶颈。@ArtemKlevtsov不,在内存中复制一个巨大的数据结构是一个瓶颈。要制作一个可复制的示例,一个包含3列和250万行随机值(范围为150000:850000)的简单矩阵就足够了。明天,我将尝试使用FREAD来摆脱as.XXX的演示,演示如何给出一个可复制的示例和一个测试,人们可以对其代码进行测试?我建议使用一个示例数据(大约10k个对象)来分析您的代码。我认为类型转换是一个瓶颈。@ArtemKlevtsov不,在内存中复制一个巨大的数据结构是一个瓶颈。要制作一个可复制的示例,一个包含3列和250万行随机值(范围为150000:850000)的简单矩阵就足够了。明天我将尝试使用FREAD来摆脱as.XXX's,如果我不得不猜测,类型转换来自于不应该是因子的因子,当然,它们需要在数据导入点进行修复。@joran我也这么猜。但是如果他使用
fread
进行数据导入(他应该这样做),这应该不是问题。哇
fread
(来自
data.table
package)很神奇。相对于大型csv文件的
read.table
,我的IO性能得到了显著提升。谢谢@罗兰!!!这正是因为它们是作为要素输入的(是的,它们不应该是)。我不是那个导入数据的人,我收到了.Rdata,我会联系他,明天再回复。我复制了data.tables,因为我需要检查每个步骤。我可以删除额外data.tables的创建,但我看不出这将如何加快进程。@Arun嗯,我们不确定正在读取的原始文件中到底有什么内容。通常,人们会无意中读到他们“认为”是数字的列,但实际上在一个值中包含了一些散乱的字符,这会把一切搞砸,或者其他什么。如果我不得不猜测的话,类型转换来自于因子,而不应该是因子,当然,他们需要在数据导入时解决这些问题。@joran我也这么想。但是如果他使用
fread
进行数据导入(他应该这样做),这应该不是问题。哇
fread
(来自
data.table
package)很神奇。相对于大型csv文件的
read.table
,我的IO性能得到了显著提升。谢谢@Roland!!!这正是因为它们是作为要素输入的(是的,它们不应该是)。我不是那个导入数据的人,我收到了.Rdata,我会联系他,明天再回复。我复制了data.tables,因为我需要检查每个步骤。我可以删除额外data.tables的创建,但我看不出这将如何加快进程。@Arun嗯,我们不确定正在读取的原始文件中到底有什么内容。通常,人们会无意中读到他们“认为”是数字的列,但实际上在一个值中包含了一些散乱的字符,这会把一切都搞糟,或者其他什么。
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)