Я меняю свой код R с data.frame
+ plyr
на data.table
s, поскольку мне нужен более быстрый и эффективный с точки зрения памяти способ обработки большого набора данных. К сожалению, мои навыки R крайне ограничены, и весь день я бился о стену. Был бы признателен, если бы специалисты ТАК здесь могли просветить.
Мои цели
- Сводные строки в моей таблице data.table на основе 2 функций - среднего и максимального - выполняются для выбранных столбцов (с именами столбцов, переданными через вектор), в то время как группировка по столбцам также передается через вектор.
- Результирующее ОУ должно содержать исходные имена столбцов.
- Не должно не быть ненужного копирования DT для экономии памяти.
Мой тестовый код
DT = data.table( a=LETTERS[c(1,1,1:4)],b=4:9, c=3:8, d = rnorm(6),
e=LETTERS[c(rep(25,3),rep(26,3))], key="a" )
GrpVar1 <- "a"
GrpVar2 <- "e"
VarToMax <- "b"
VarToAve <- c( "c", "d")
То, что я пробовал, но у меня не получилось
DT[, list( b=max( b ), c=mean(c), d=mean(d) ), by=c( GrpVar1, GrpVar2 ) ]
# Hard-code col name - not what I want
DT[, list( max( get(VarToMax) ), mean( get(VarToAve) )), by=c( GrpVar1, GrpVar2 ) ]
# Col names become 'V1', 'V2', worse, 1 column goes missing - Not what I want either
DT[, list( get(VarToMax)=max( get(VarToMax) ),
get(VarToAve)=mean( get(VarToAve) ) ), by=c( GrpVar1, GrpVar2 ) ]
# Above code gave Error!
Дополнительный вопрос
Основываясь на моем очень ограниченном понимании DT, аргумент with = F
должен указывать R на анализ значений VarToMax и VarToAve, но выполнение приведенного ниже кода приводит к ошибке.
DT[, list( max(VarToMax), mean(VarToAve) ), by=c( GrpVar1, GrpVar2 ), with=F ]
# Error in `[.data.table`(DT, , list(max(VarToMax), mean(VarToAve)), by = c(GrpVar1, :
# object 'ansvals' not found
# In addition: Warning message:
# In mean.default(VarToAve) :
# argument is not numeric or logical: returning NA
Существующие решения SO не могут помочь
Я дошел до этого с помощью решения Аруна, но я очень застрявший. Другое его решение, использующее lapply
и .SDcols
, включает создание 2 дополнительных DT, что не отвечает моим требованиям к сохранению памяти.
dt1 <- dt[, lapply(.SD, sum), by=ID, .SDcols=c(3,4)]
dt2 <- dt[, lapply(.SD, head, 1), by=ID, .SDcols=c(2)]
Я ТАК запутался в data.table! Любая помощь будет очень признательна!
colMeans
на самом деле может быть не идеальным. См. этот ответ Аруна. 02.02.2015.SD
черезlapply
(который в основном вызывает весь набор данных несколько раз, а также в настоящее время не оптимизирован) или преобразование в матрицу. 02.02.2015