将数据集划分为块

时间:2012-01-06 18:36:42

标签: performance r dataframe

如果我将一个函数应用于超过1000行的数据集,那么我在R中会有一个chokes函数。因此,我想将我的数据集拆分为n个块的列表,每个块不超过1000行。

这是我目前用来进行分块的功能:

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

我想提高此功能的效率,以便在大型数据集上运行得更快。

3 个答案:

答案 0 :(得分:7)

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

由于输出仍然是数据框列表,因此您可以轻松地在输出上使用lapply来处理数据,并根据需要进行组合。

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

答案 1 :(得分:3)

通过拨打lapply()

来替换split()来电
split(Data, Chunks)

答案 2 :(得分:2)

您还应该查看ddply plyr包的chunkid,此包是围绕split-apply-combine原则构建的。 This paper about the package解释了这是如何工作的以及plyr中可用的内容。

我将采取的一般策略是将新数据添加到名为rep的数据集中。这会以1000行的块为单位切断数据,查看result = ddply(dat, .(chunkid), functionToPerform) 函数来创建此行。然后你可以这样做:

plyr

我喜欢data.table因其清晰的语法和结构,以及对并行处理的支持。如前所述,请同时查看{{1}} {{1}},some situations可能会更快。

另一个提示可能是使用矩阵而不是data.frames ......