【发布时间】:2011-04-05 08:50:42
【问题描述】:
我编写了自己的名为 batcheffect 的函数来重新计算数据框中的所有值。 该函数只需要数据框作为导入。首先,在函数中计算平均值,然后对数据框中的每个点进行计算并创建一个新的数据框。
batcheffect <- function (experiment){
corr<-list()
matrixexp<-as.matrix(experiment)
expmean <-mean(matrixexp)
for (i in 1:length(matrixexp)){
correction <- (matrixexp[i]-overallmean - expmean)+overallmean
corr[[i]]<- matrix(correction)
}
return(unlist(corr))
}
对于大型数据帧,函数内的循环很慢。所以我想使用 sapply 或 lapply 函数来加速这个过程。有人给点建议吗?
谢谢
更新: 例如我有一个这样的数据框 df
计算数据框中所有值的平均值。数据帧被转换为矩阵 df1
数据的第一个目标是通过列名生成子集。您生成三个组,A 组,B 组和 C 组。子集由以下代码定义:
"selectexperiments" <- function (partialname, data)
{
result <- data[,grep(partialname, colnames(data))]
return(result)
}
A<-selectexperiments('A', df)
B<-selectexperiments('B', df)
C<-selectexperiments('C', df)
创建了三个组。对于例如组 A 中的每个值,我想计算以下总和: (值 - 总体均值 - 组的均值)+ 总体均值。 因此我创建了这个批处理效果函数。
"batcheffect" <- function (group)
{
corr<-list()
matrixexp<-as.matrix(group)
expmean <-mean(matrixexp) #mean of the group
for (i in 1:length(matrixexp)){
correction <- (matrixexp[i]-overallmean - expmean)+overallmean
corr[[i]]<- matrix(correction)
}
return(unlist(corr))
}
Abatch<-batcheffect(A)
结果现在可以了,但是我会将结果作为数据框返回。对于我自己的数据,这个功能真的很慢,所以我认为可能有一种加速方法,比如 sapply 的东西。
【问题讨论】:
-
您能否举一个示例数据框,并解释一下overallmean的来源?
-
@csgillespie :请不要在问题中编辑代码。编辑时不应该“优化”代码。这可能会导致完全混乱。
-
@Joris:对不起,我的错。我不是要更改代码,只是缩进它。我不小心删除了(如您所见)
as.matrix行。我想你对“代码格式”没有问题? -
@csgillespie :格式没问题,我只注意到它已经消失了,因为 Richie 对我的回答发表了评论。