2012-01-06 4 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 строк? –

+0

Да, действительно! Вам просто нужно узнать об управлении памятью или о том, как (не) организовать ваши данные. Также определите «дроссель». Просто потому, что 1000rows (* сколько столбцов?) Заканчивается до того, как вы соскучитесь, не означает, что время обработки сети для 10^5 строк улучшено. –

+0

@CarlWitthoft и Джош: Спасибо за предложения. Я уже немного оптимизировал эту функцию, но это связано с множеством преобразований данных, которые всасывают память, и я не думаю, что этого можно избежать. Я на самом деле решил просто сосать его и «применять» эту функцию по строкам, что занимает много времени, но не исчерпывает память. – Zach

ответ

7

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

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

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

+0

Я раньше не слышал о функции разделения. Приятно узнать, что моя проблема настолько элегантно решена в базе R! – Zach

+0

есть. Есть несколько таких скрытых драгоценных камней в 'base' R. – Ramnath

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 ...

Смежные вопросы