Извините за точки и, возможно, неправильное понимание вопроса; но я немного тороплюсь и должен успеть на автобус примерно через минус пять минут!

я есть фрейм данных с 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")

Я получаю хорошую производительность и несколько элегантный код многократного использования.

Ответы на вопрос(2)

Ваш ответ на вопрос