Разделите фрейм данных, используя два столбца данных, и примените общее преобразование к списку результирующих фреймов данных. - PullRequest
33 голосов
/ 20 января 2012

Я хочу разбить большой фрейм данных на список фреймов в соответствии со значениями в двух столбцах. Затем я хочу применить общее преобразование данных ко всем фреймам данных (преобразование запаздывания) в результирующий список. Я знаю о команде split, но могу заставить ее работать только с одним столбцом данных за раз.

Ответы [ 2 ]

52 голосов
/ 20 января 2012

Вы должны поместить в список все факторы, которые вы хотите разделить, например:

split(mtcars,list(mtcars$cyl,mtcars$gear))

Тогда вы можете использовать lapply, чтобы сделать то, что вы хотите сделать.

Если вы хотите избежать наличия в результатах нулевых строк данных, есть параметр drop, значение по умолчанию которого противоположно параметру drop в функции "[".

split(mtcars,list(mtcars$cyl,mtcars$gear), drop=TRUE)
7 голосов
/ 20 января 2012

как насчет этого:

 library(plyr)
 ddply(df, .(category1, category2), summarize, value1 = lag(value1), value2=lag(value2))

кажется отличной работой для пакета plyr и функции ddply(). Если есть еще открытые вопросы, предоставьте пример данных. Разделение также должно работать на несколько столбцов:

df<- data.frame(value=rnorm(100), class1=factor(rep(c('a','b'), each=50)), class2=factor(rep(c('1','2'), 50)))
g <- c(factor(df$class1), factor(df$class2))
split(df$value, g)
...