Строка R означает несколько столбцов по группам (или уникальным идентификаторам).

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

          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 секунд. Проблема в том, что у меня есть сотни подобных таблиц......

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).В любом случае, есть ли более быстрый способ агрегировать данные? Очень ценю!

11
задан Matt Dowle 25 June 2012 в 14:30
поделиться