使用lapply / sapply重新计算数据框中的每个点
我编写了自己的名为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&lt; - data.frame(A = 1:10,B = 10:1,C = 11:20,C1 = 21:30,B1 = 31:40,A2 = 41:50)
计算数据框中所有值的平均值。数据帧将转换为矩阵
DF1&LT; -as.matrix(DF)
overallmean&LT; -mean(DF1)
数据的第一个目标是通过colnames创建子集。您生成三个组,分组为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)
这三组是创建的。对于eg.group A中的每个值,我想要计算以下总和:
(值 - overallmean -meanofthegroup)+ overallmean。
因此我创建了这个batcheffect函数。
"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)
现在结果还可以,但我会将结果作为数据帧返回。而对于我自己的数据,这个功能真的很慢,所以,我认为maby有一种加速的方法,比如某种东西。
没有找到相关结果
已邀请:
1 个回复
布埃郝卞簿
并将给出完全相同的结果。简单的微积分表明
完全等于
并且由于R计算是矢量化的,因此不需要循环。它返回一个向量(因此是
函数)。 使用
,您可以进一步简化为:
它再次返回完全相同的结果。你确定这是你的想法吗? 编辑: 鉴于您的意见,我在这里添加测试代码。我把你原来的功能命名为
。如您所见,在示例数据帧上(并在初始化神秘
之后),所有函数的结果都是相同的:
编辑2: 要获得batcheffect返回类似原始数据的数据帧,您只需要一行代码:
您现在可以在一个函数中处理完整的原始数据帧:
然后 :
返回包含所有列的数据框,其中对于每个列,该组意味着减去。如前所述,您可以添加并随后删除整体,但这根本没有区别。