Используя data.tables, пытаясь агрегировать данные по индексу столбца - PullRequest
4 голосов
/ 28 января 2012

У меня возникли проблемы с использованием пакета data.table. Я использую этот пакет, потому что он кажется очень быстрым и эффективным с памятью, и он будет работать с очень большим набором данных (~ 6 м х 300).

Итак, в основном пример проблемы, с которой я столкнулся:

AA <- matrix(runif(50,0,100), 10,5)
AA <- data.table(AA)
colnames(AA) <- c("one","two","three","four","five")
AA[,"key"] <- c(1:10)
setkey(AA,key)

BB <- matrix(c("A1","A1","B1","A1","C1","F1","T1","Y1","S1","S1","B2","C2","V2","G2","R2","U2","P2","Q2","A2","R2"),10,2)
BB <- data.table(BB)
BB[,"key"] <- c(1:10)
setkey(BB,key)

CC <- AA[BB]

Это дает следующее

> CC
  key       one       two     three     four     five V1 V2
 [1,]   1 70.528360  7.901987 66.827238 44.51487 26.22273 A1 B2
 [2,]   2 38.560889 31.808611  7.877950 34.51093 51.27989 A1 C2
 [3,]   3 70.164154 16.636281 59.127573 79.95673 19.07643 B1 V2
 [4,]   4 82.019267 86.958215  3.335632 44.19048 46.29047 A1 G2
 [5,]   5 24.980403 25.352212 78.240760 93.69818 46.64401 C1 R2
 [6,]   6  1.062644 30.214449 15.920193 35.15496 97.86995 F1 U2
 [7,]   7  5.242374 47.591899 56.879902 70.05319 82.48689 T1 P2
 [8,]   8 69.646271 69.576102 38.766948 38.62866 74.69404 Y1 Q2
 [9,]   9 25.335255 54.638416  5.777238 80.87692 34.11951 S1 A2
[10,]  10 54.844424 18.645826 59.370042 48.24352 84.02630 S1 R2

Я пытаюсь агрегировать данные по V1 и V2

* * 1010

Проблема, с которой я столкнулся, заключается в том, что, если я не знаю явно имена столбцов, по которым я хочу агрегировать, или если я хочу просмотреть, скажем, 100 столбцов, получая 100 различных агрегатов, как я могу это сделать?

Справочное руководство по data.table говорит, что это работает так, как работает, поскольку на переменные ссылаются в области действия таблицы данных, поэтому CC [, V1] даст один столбец, тогда как CC [, "V1"] победил «т. Он говорит, что вы можете использовать что-то вроде

x <- quote(V1)
CC[,length(one), by=eval(x)]

Но это, похоже, не работает, я пробовал несколько вещей, таких как установка имен переменных в векторе и различные комбинации quote (), noquote (), enquote (), но я не могу показаться выяснить, если это возможно.

Как я могу настроить это, чтобы циклически проходить список имен столбцов, агрегирующих по каждому?

Если нет, то есть ли лучшие способы быстрого агрегирования большого набора данных, как этот?

Спасибо.

1 Ответ

5 голосов
/ 30 января 2012

Я не совсем уверен, для чего вы собираетесь - я думаю, что вам, возможно, придется придумать лучший пример того, что вы пытаетесь сделать.

Вы можете, например, передатьсимвольный вектор в by, поэтому это будет работать:

agg.by <- "V1"
CC[, length(one), by=agg.by]

Если вы хотите суммировать «неизвестные» столбцы в ваших подмножествах, вы можете lapply в .SD data.table, чтонаходится в области видимости внутри каждого из ваших агрегатов, например:

CC[, lapply(.SD, mean), by=agg.by]

Если вы суммируете только несколько столбцов из вашего исходного data.table, используйте аргумент .SDcols, например:

CC[, lapply(.SD, mean), by=agg.by, .SDcols=c('one', 'two')]

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

Если вы можете дать лучший кусокпример данных и ожидаемые результаты, я буду рад помочь в дальнейшем.

...