如果我将一个函数应用于超过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)
我想提高此功能的效率,以便在大型数据集上运行得更快。
答案 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 ......