Я бы хотел агрегировать 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
со столбцами идентификаторов chromosome
, ensg
, symbol
и средним числом числовых столбцов над строками с одинаковым идентификатором. Я реализовал это в 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
заключается в том, что мне нужно заново присоединить описывающие переменные. Я не понял, как использовать мою пользовательскую функцию с aggregate
, поскольку aggregate
не пропускает фреймы данных, а только векторы.
Есть ли элегантный способ сделать это с aggregate
? Или есть какой-нибудь более быстрый способ сделать это с ddply
?