Ускорение преобразования человека в период данных в формате R в R - PullRequest
4 голосов
/ 17 октября 2011

У меня есть набор данных с продольными данными в личностно-ориентированном формате, например:

pid varA_1 varB_1 varA_2 varB_2 varA_3 varB_3 ...
1   1      1      0      3      2      1
2   0      1      0      2      2      1
...
50k 1      0      1      3      1      0

Это приводит к большому кадру данных, с минимальными 50k наблюдениями и 90 переменными, измеренными на срок до 29 периодов.

Я хотел бы получить более ориентированный на период формат, как таковой:

pid index start stop varA varB varC ...
1   1     ...
1   2     
...
1   29
2   1

Я пробовал разные подходы для изменения формы данных (*apply, plyr, reshape2, циклы, добавление или предварительное заполнение всех числовых матриц и т. д.), но, похоже, не получается приличное время обработки (+ 40 минут для подмножеств).По пути я обнаружил различные намеки на то, чего следует избегать, но я все еще не уверен, упустил ли я какое-то узкое место или возможное ускорение.

Существует ли оптимальный подход к такой обработке данных, чтобы я мог оценить лучшее время обработки, которое я могу достичь в чистом R-коде?На Stackoverflow было похожих вопросов , но они не дали убедительных ответов ...

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Во-первых, давайте построим пример данных (я использую 5e3 вместо 50e3, чтобы избежать проблем с памятью в моей конфигурации):

nObs <- 5e3
nVar <- 90
nPeriods <- 29

dat <- matrix(rnorm(nObs*nVar*nPeriods), nrow=nObs, ncol=nVar*nPeriods)

df <- data.frame(id=seq_len(nObs), dat)

nmsV <- paste('Var', seq_len(nVar), sep='')
nmsPeriods <- paste('T', seq_len(nPeriods), sep='')

nms <- c(outer(nmsV, nmsPeriods, paste, sep='_'))
names(df)[-1] <- nms

А теперь с stats::reshape вы меняете формат:

df2 <- reshape(df, dir = "long", varying = 2:((nVar*nPeriods)+1), sep = "_")

Я не уверен, что это решение fast , которое вы ищете.

1 голос
/ 17 октября 2011

Стареющая функция stack () может быть очень быстрой, если что-то умещается в памяти.

Для большого набора лучше всего использовать (прозрачную) базу данных sqlite в качестве промежуточной.Попробуйте пакет от Gabor sqldf, на googlecode есть много примеров.

http://code.google.com/p/sqldf/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...