首页 文章

使用lapply / sapply重新计算数据框中的每个点

提问于
浏览
1

我编写了自己的名为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 < - data.frame(A = 1:10,B = 10:1,C = 11:20,C1 = 21:30,B1 = 31:40,A2 = 41 :50)

计算数据框中所有值的平均值 . 数据帧转换为矩阵df1 <-as.matrix(df)overallmean <-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中的每个值,我想要计算以下总和:( value - 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 回答

  • 1

    你的功能很奇怪 . 它可以简化为:

    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
    

    编辑2:

    要获得batcheffect返回类似原始数据的数据帧,您只需要一行代码:

    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"))
    

    返回包含所有列的数据框,其中对于每个列,该组意味着减去 . 如前所述,您可以添加并随后删除整体,但这根本没有区别 .

相关问题