2012-01-06 44 views
3

我在R如果我把它应用到超过1000行的数据集电抗器的功能。因此,我想将我的数据集分成n个块,每个块不超过1000行。把一个数据集分成块

这里是我目前使用做分块的功能:

chunkData <- function(Data,chunkSize){ 
    Chunks <- floor(0:(nrow(Data)-1)/(chunkSize)) 
    lapply(unique(Chunks),function(x) Data[Chunks==x,]) 
} 
chunkData(iris,100) 

我想使这个功能更高效,使其运行在大型数据集的速度更快。

+1

为什么不解决这个问题上有超过1000行对象扼流圈的功能? – 2012-01-06 19:19:23

+0

是的,真的!您可能只需要了解内存管理,或者了解如何(而不是)组织数据。另外,定义“扼杀”。仅仅因为1000行(*多少列)在你感到无聊之前完成,并不意味着10^5行的净处理时间得到了改善。 – 2012-01-06 22:28:56

+0

@CarlWitthoft和Josh:谢谢你的建议。我已经对这个函数进行了很多优化,但是它涉及到大量的数据转换,它们吸收了内存,我认为这是不可避免的。我实际上决定把它吸起来并逐行应用这个函数,这需要很长时间,但不会耗尽内存。 – Zach 2012-01-06 23:32:04

回答

7

您可以使用base R中的split轻松完成此操作。例如,split(iris, 1:3)将按行将数据集拆分为三个数据框的列表。您可以修改参数以指定块大小。

因为输出仍然是数据帧的列表,你可以很容易地使用lapply在输出处理数据,并根据需要将它们结合起来。

由于速度是使用此方法的主要问题,因此我建议您查看data.table程序包,该程序包适用于大型数据集。如果您在自己的功能中指定了更多关于您想实现的信息,则SO中的人员可能会提供帮助。

+0

我从来没有听说过拆分功能。很高兴发现我的问题在基本R中得到了优雅的解决! – Zach 2012-01-06 19:57:20

+0

是的。 'base'中有几个这样的隐藏宝石。 – Ramnath 2012-01-06 20:04:14

3

更换lapply()呼叫通过调用split()

split(Data, Chunks) 
2

你也应该看看ddply FOM的plyr包,这个包是围绕裂应用于-结合的原则建立。 This paper about the package解释了这是如何工作的,以及plyr中可用的东西。

我会采取这里的一般策略是一个新的数据添加到一个名为chunkid数据集。这将以1000行的块形式切割数据,查看rep函数来创建该行。然后,你可以这样做:

result = ddply(dat, .(chunkid), functionToPerform) 

我喜欢plyr以其清晰的语法和结构,其支持并行处理。前面已经说了,也请看一看data.table,这可能是一个相当快一点在some situations

一个额外的小费可能是使用data.frames代替矩阵...