Извините за точки и, возможно, неправильное понимание вопроса; но я немного тороплюсь и должен успеть на автобус примерно через минус пять минут!
я есть фрейм данных с 2 миллионами строк и 15 столбцами. Я хочу сгруппировать по 3 из этих столбцов с помощью ddply (все 3 являются факторами, и существует 780 000 уникальных комбинаций этих факторов) и получить средневзвешенное значение из 3 столбцов (с весами, определенными моим набором данных). Следующее довольно быстро:
system.time(a2 <- aggregate(cbind(col1,col2,col3) ~ fac1 + fac2 + fac3, data=aggdf, FUN=mean))
user system elapsed
91.358 4.747 115.727
Проблема в том, что я хочу использовать weighted.mean вместо mean для вычисления моих агрегированных столбцов.
Если я попробую следующий ddply в том же фрейме данных (заметьте, я приведу к неизменяемому), следующее не завершится через 20 минут:
x <- ddply(idata.frame(aggdf),
c("fac1","fac2","fac3"),
summarise,
w=sum(w),
col1=weighted.mean(col1, w),
col2=weighted.mean(col2, w),
col3=weighted.mean(col3, w))
Эта операция, кажется, требует много ресурсов процессора, но не сильно загружает память.
РЕДАКТИРОВАТЬ: Итак, я закончил писать эту маленькую функцию, которая немного «обманывает», используя некоторые свойства взвешенного среднего и выполняет умножение и деление на весь объект, а не на срезы.
weighted_mean_cols <- function(df, bycols, aggcols, weightcol) {
df[,aggcols] <- df[,aggcols]*df[,weightcol]
df <- aggregate(df[,c(weightcol, aggcols)], by=as.list(df[,bycols]), sum)
df[,aggcols] <- df[,aggcols]/df[,weightcol]
df
}
Когда я бегу как:
a2 <- weighted_mean_cols(aggdf, c("fac1","fac2","fac3"), c("col1","col2","col3"),"w")
Я получаю хорошую производительность и несколько элегантный код многократного использования.