R中拆分的快速替代方案

R中拆分的快速替代方案,r,split,pentaho,lapply,R,Split,Pentaho,Lapply,我使用split()对数据帧进行分区,以便使用parlappy()在每个分区上并行调用函数。数据帧有130万行和20列。我用两列进行拆分/分区,两列都是字符类型。看起来有~47K个唯一ID和~12K个唯一代码,但不是每个ID和代码对都匹配。由此产生的分区数约为250K。以下是split()行: system.time(pop_part <- split(pop, list(pop$ID, pop$code))) 我已经让split()。我可以单独按ID分割,这需要约10分钟。此外,R

我使用
split()
对数据帧进行分区,以便使用
parlappy()
在每个分区上并行调用函数。数据帧有130万行和20列。我用两列进行拆分/分区,两列都是字符类型。看起来有~47K个唯一ID和~12K个唯一代码,但不是每个ID和代码对都匹配。由此产生的分区数约为250K。以下是
split()
行:

 system.time(pop_part <- split(pop, list(pop$ID, pop$code)))
我已经让
split()。我可以单独按ID分割,这需要约10分钟。此外,R studio和工作线程消耗约6GB的RAM

我知道分区数量的原因是我在Pentaho Data Integration(PDI)中有相当于30秒的代码(对于整个程序,而不仅仅是“拆分”代码)。我不希望R有这样的表现,但在最坏的情况下可能在10-15分钟内完成


主要问题是:有没有更好的选择来代替拆分?我也用
.parallel=TRUE
尝试了
ddply()
,但它也运行了一个多小时,从未完成过。

将索引拆分为
pop

idx <- split(seq_len(nrow(pop)), list(pop$ID, pop$code))
因此,如果您的是,我想您的数据中有一些方面会减慢速度,例如,
ID
code
都是具有多个级别的因素,因此它们的完整交互作用,而不是数据集中出现的级别组合,都会被计算出来

> length(split(1:10, list(factor(1:10), factor(10:1))))
[1] 100
> length(split(1:10, paste(letters[1:10], letters[1:10], sep="-")))
[1] 10
或者你的内存不足

如果您在非Windows计算机上使用进程,请使用
mclappy
而不是
parlappy
(我猜是这样,因为您要求使用
detectCores()

par_popSplit(x,f)是慢的,如果x是一个因子,f包含很多不同的元素

因此,如果快速,此代码:

system.time(split(seq_len(1300000), sample(250000, 1300000, TRUE)))
但是,这是非常缓慢的:

system.time(split(factor(seq_len(1300000)), sample(250000, 1300000, TRUE)))
这又快了,因为只有25个小组

system.time(split(factor(seq_len(1300000)), sample(25, 1300000, TRUE)))

谢谢,我试试看。哈,事实上,我最初编写了R代码,然后将其移植到PDI(我对R比PDI更有经验)。我运行了您发布的
split()
代码,等待了将近一个小时,但始终没有完成。围绕split添加了一些额外的建议,应该需要一秒钟或更短的时间。也许一些因素也导致了func的速度变慢?这对我非常非常有帮助。很长一段时间以来,我一直在粘贴字符串的数据帧上盲目使用“拆分”,内存开销非常大(data.frames将RAM乘以4x+)。这使我能够在9核而不是2核上运行代码,非常感谢。
system.time(split(seq_len(1300000), sample(250000, 1300000, TRUE)))
system.time(split(factor(seq_len(1300000)), sample(250000, 1300000, TRUE)))
system.time(split(factor(seq_len(1300000)), sample(25, 1300000, TRUE)))