Ваша функция довольно странная.Это может быть упрощено до:
batcheffect <- function (experiment){
matrixexp<-as.matrix(experiment)
expmean <-mean(matrixexp)
c(matrixexp - expmean)
}
и даст точно такой же результат.Простое исчисление показывает, что
(matrixexp[i]-overallmean - expmean)+overallmean
совершенно равно
matrixexp[i]- expmean
И поскольку R-вычисления векторизованы, цикл не требуется.Возвращает вектор (следовательно, функция c()
).
Используя unlist()
, вы можете еще больше упростить до:
batcheffect2 <- function(experiment){
x <- unlist(experiment,use.names=F)
x - mean(x)
}
, что снова возвращает точно такой же результат.Вы уверены, что это то, что вы имели в виду?
РЕДАКТИРОВАТЬ:
Учитывая ваши комментарии, я добавляю сюда тестовый код.Я назвал вашу оригинальную функцию old.batcheffect()
.Как видите, на примере кадра данных (и после инициализации тайны overallmean
) результат всех функций одинаков:
> Df <- data.frame(A1=1:10,B1=10:1,C1=11:20)
> overallmean <- runif(1)
> X1 <- old.batcheffect(Df)
> X2 <- batcheffect(Df)
> X3 <- batcheffect2(Df)
> all.equal(X1,X2)
[1] TRUE
> all.equal(X2,X3)
[1] TRUE
EDIT2:
Для получения батч-эффектавозвращая фрейм данных, такой как оригинал, вам нужна только одна строка кода:
batcheffect <- function(x) x - mean(unlist(x))
Теперь вы можете обработать весь оригинальный фрейм данных в одной функции:
summaryBatch <- function(data,groups){
tmp <- lapply(groups,function(x){
data[,grep(x,names(data))]
})
out <- lapply(tmp,function(x){
x - mean(unlist(x))
})
do.call(cbind,out)
}
Тогда:
summaryBatch(df,c("A","B","C"))
возвращает фрейм данных со всеми столбцами, где для каждого столбца вычитается среднее значение группы.Как было сказано ранее, вы можете добавлять и впоследствии удалять общее значение, но это не имеет значения.