Подставьте значения с их средним значением во фрейм данных в R - PullRequest
4 голосов
/ 09 октября 2011

Мне нужно заменить значения двух реплик (A и B) в кадре данных на их среднее значение.

Это фрейм данных:

Sample.Name <- c("sample01","sample01","sample02","sample02","sample03","sample03")
Rep <- c("A", "B", "A", "B", "A", "B")
Rep <- as.factor(Rep)
joy <- sample(1000:50000000, size=120, replace=TRUE)
values <- matrix(joy, nrow=6, ncol=20)
df.data <- cbind.data.frame(Sample.Name, Rep, values)
names(df.data)[-c(1:2)] <- paste("V", 1:20, sep="")

И это цикл, который я пытался написать, чтобы заменить среднее значение для реплики:

Sample <- as.factor(Sample.Name)
livelli <- levels(Sample)
for (i in (1:(length(livelli)))){
    estrai.replica <- which(df.data == livelli[i])
    media.replica <- apply(values[estrai.replica,], 2, mean)
    foo <- rbind(media.replica)
}

Основные проблемы:

  1. таким образом, у меня есть только последняя строка в моем новом фрейме данных (foo), и
  2. У меня нет названия образца ни в одном столбце.

Есть ли у вас какие-либо предложения?

Ответы [ 3 ]

4 голосов
/ 09 октября 2011

Я думаю, что вы хотите aggregate ваш фрейм данных.Попробуйте это:

aggregate(df.data, by=list(Sample.Name), FUN=mean)
2 голосов
/ 09 октября 2011

Из любопытства я попробовал решение на основе tapply.

# Not correct: lapply(df.data[-(1:3)], tapply, INDEX=df.data$Sample.Name, FUN=mean)

Это просто нужно as.data.frame, чтобы "очистить его".

# Not correct: as.data.frame(lapply(df.data[-(1:3)], tapply, INDEX=df.data$Sample.Name, FUN=mean))

РЕДАКТИРОВАТЬ: Как и @daroczig, я получил ошибку, сообщающую, что аргумент обрезки для mean.default не имеет длины 1. Поэтому попытка добавить дополнительные аргументы в форме означает, что была предпринята попытка, но только тогда, когда я также изменил версию с двумя аргументами "[" удалось ли мне удовлетворить интерпретатора, но все еще не получить правильную группировку приложения функции. Эта версия работает:

as.data.frame(lapply(df.data[, 3:22], 
                       function(x) tapply(x, df.data$Sample.Name, FUN=mean))  )
1 голос
/ 13 сентября 2012

A data.table решение для экономии времени и памяти

library(data.table)
DT <- as.data.table(df.data)
DT[,lapply(.SD, mean),by = Sample.Name, .SDcols = paste0('V',1:20)]

Обратите внимание, что .SD является подмножеством для каждой группы, а .SDcols определяет столбцы в .SD для оценки lapply после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...