Разделите набор данных на куски - PullRequest
3 голосов
/ 06 января 2012

У меня есть функция в 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)

Я хотел бы сделать эту функцию более эффективной, чтобы она работала быстрее на больших наборах данных.

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Вы можете легко сделать это, используя split из base R. Например, split(iris, 1:3), разделит набор данных iris на список из трех кадров данных за строкой.Вы можете изменить аргументы, чтобы указать размер чанка.

Поскольку вывод по-прежнему представляет собой список фреймов данных, вы можете легко использовать lapply на выходе для обработки данных и комбинировать их при необходимости.

Поскольку скорость является основной проблемойдля использования этого подхода я бы рекомендовал вам взглянуть на пакет data.table, который отлично работает с большими наборами данных.Если вы укажете больше информации о том, чего вы пытаетесь достичь в своей функции, сотрудники SO могут помочь.

3 голосов
/ 06 января 2012

Заменить lapply() вызов на split():

split(Data, Chunks)
2 голосов
/ 06 января 2012

Вам также следует взглянуть на ddply из пакета plyr, этот пакет построен по принципу разделения-применения-объединения. Этот документ о пакете объясняет, как это работает и какие вещи доступны в plyr.

Общая стратегия, которую я бы здесь использовал, заключается в добавлении новых данных в набор данных с именем chunkid. Это разрезает данные на куски по 1000 строк, посмотрите на функцию rep, чтобы создать эту строку. Затем вы можете сделать:

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

Мне нравится plyr за его ясный синтаксис и структуру, а также поддержку параллельной обработки. Как уже было сказано, пожалуйста, взгляните также на data.table, который может быть немного быстрее в некоторых ситуациях .

Дополнительным советом может быть использование матриц вместо data.frames ...

...