2012-06-13 7 views
9

У меня есть фрейм данных, как показано ниже (20 000 строк по 49 столбцов). Каждая строка имеет уникальное имя (ID), каждый идентификатор имеет 3 повторных чтения в 3 столбцах (например, D15C D15C.1 D15C.2). Первые 4 буквы столбцов («D15C») - это имена групп. Мне нужно усреднять столбцы по именам групп (например, средние D15C, D15C.1 и D15.2 для получения D15C), поэтому итоговая таблица будет консолидирована до 16 столбцов из 49 столбцов.R строк означает несколько столбцов по группам (или уникальным идентификаторам)

  ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2 
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52 
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76 
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47 
(… 20000 rows)            

Я транспонировать и редактировал его к следующему кадру данных для того, чтобы использовать агрегат:

 ID 1367452_at 1367453_at 1367454_at ... ... 
1 D04C  11.11  9.65  10.19 
2 D04C  10.93  9.94  10.36 
3 D08H  11.85  9.78  9.68 
4 D08H  10.94  9.68  10.07 
5 D08H  10.87  9.67  10.08 
6 D15C  10.73  9.86  10.35 
7 D15C  10.62  9.71  10.26 
8 D15C  10.85  9.82  10.32 
9 D15L  10.73  9.74  10.27 
10 D15L  10.77  9.71  10.19 
11 D15L  10.52  9.76  10.47 

Но, следующий совокупный («AGG» это имя фрейма данных) занимает 370 секунд, чтобы завершить , Проблема заключается в том, что у меня есть 100 из такого рода таблиц ожидания ......

agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T) 

Так я преобразовал его к data.table и запустить метод таблицы данных.

dt <- as.data.table(agg) 
setkey(dt, ID) 
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

но получил сообщение об ошибке после нескольких минут:

Error: cannot allocate vector of size 144 Kb 
In addition: Warning messages: 
1: Reached total allocation of 1535Mb: see help(memory.size) 
2: Reached total allocation of 1535Mb: see help(memory.size) 

Не уверен, что это неправильно. Невозможно использовать dt [1: 5,1: 5], чтобы увидеть «головную» часть dt, а head (dt) возвращает слишком много строк, проходящих через крышу, я тоже не вижу «голову». Не знаю, что делать сейчас.

Я могу указать идентификаторы в одном столбце (как в data.frame) или перенести таблицу и перечислить идентификаторы в первой строке (как в data.table). В любом случае, есть ли более быстрый способ агрегирования данных? Очень ценим!

+0

Первый вопрос, а? Добро пожаловать. Вы действительно имеете в виду data.table, как в пакете 'data.table'? Если вы попробовали 'transpose' и' aggregate', тогда лучше всего предоставить точные команды, которые вы пытались, чтобы люди могли помочь. Не знаю, что вы подразумеваете под «методом Data.table». Там, вероятно, есть некоторые рекомендации по заданию хороших вопросов о переполнении стека где-нибудь (но я не могу их быстро). Попробуйте комнату в R, чтобы попросить совета. –

+0

Жаль, что все было неясно. Я отредактировал его, чтобы предоставить более подробную информацию. Надеюсь, теперь это станет понятным. – user1444754

+0

Намного лучше, спасибо. Это очень быстро ответило. –

ответ

12

Это:

dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

должно быть просто:

dt2 <- dt[, lapply(.SD,mean), by=ID] 

dt[2:ncol(dt)] был на самом деле принимает подмножество строк.

Один быстрый способ узнать, что синтаксис data.table должен запускать example(data.table) в командной строке и работать с примерами в командной строке. Если вы ищете, что для «# применения через столбцы по группам» вы найдете именно этот пример.

И учиться .SD, лучше всего искать ?data.table для строки ".SD", а затем также есть некоторые хорошие вопросы и очень подробные ответы о .SD в этом data.table теге, которые возвращаются с помощью поиска «[data.table ] .SD ".

+0

Спасибо, Мэтью. Ваш код работал красиво. Я только начал изучать .SD и запускать примеры этим утром. Кстати, есть ли способ обрабатывать данные с группой (например, ID) в первой строке (т. Е. Транспонированной таблице)?Причина, по которой я спрашиваю, заключается в том, что R, похоже, обрабатывает более длинные [30 000, 3000], а не более широкие [3000, 30 000], таблицы лучше. например, для записи. занимает длинную 1 сек., но длится 5 минут, чтобы сохранить ту же самую ширину, что и переносимая широкоформатная таблица. Поэтому я должен всегда переносить таблицу перед сохранением и переносить таблицу перед ее работой. Это «моя» уникальная проблема? – user1444754

+1

@ user1444754 Рад, что он работает сейчас. Не забудьте проголосовать за мой ответ и принять его (отметьте его), пожалуйста. Так что другие знают, что это разрешено. В этом комментарии это звучит уместно для нового вопроса. Лучше всего представить ненадежный пример того, что ответчик может вставить новый сеанс R, чтобы быстро узнать, что вы имеете в виду. –

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

  • Нет связанных вопросов^_^