Элегантный способ решить задачу ddply с помощью агрегата (в надежде на лучшую производительность)

Я хотел бы агрегировать data.frame с помощью переменной идентификатора, называемой ensg . Фрейм данных выглядит следующим образом:

  chromosome probeset               ensg symbol    XXA_00    XXA_36    XXB_00
1          X  4938842 ENSMUSG00000000003   Pbsn  4.796123  4.737717  5.326664

Я хочу вычислить среднее значение для каждого числового столбца по строкам с таким же значением ensg . Проблема здесь в том, что я хотел бы оставить нетронутыми другие переменные идентичности - хромосому и символ, поскольку они одинаковы для того же Ensg .

В конце я хотел бы получить data.frame с идентификационными столбцами , хромосома , ensg , символ и среднее значение числовые столбцы над строками с тем же идентификатором. Я реализовал это в ddply , но он очень медленный по сравнению с aggregate :

spec.mean <- function(eset.piece)
  {
    cbind(eset.piece[1,-numeric.columns],t(colMeans(eset.piece[,numeric.columns])))
  }
t
mean.eset <- ddply(eset.consensus.grand,.(ensg),spec.mean,.progress="tk")

Моя первая агрегированная реализация выглядит так,

mean.eset=aggregate(eset[,numeric.columns], by=list(eset$ensg), FUN=mean, na.rm=TRUE);

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

Есть ли элегантный способ сделать это с помощью aggregate ? Или есть более быстрый способ сделать это с помощью ddply ?

7
задан Matt Dowle 28 March 2013 в 00:27
поделиться