在R中尝试使用apply而不是for循环执行任务时内存不足



我正试图重写一些旧代码,以使其更有效。我在我的地方读到,使用apply应该比使用for循环快,所以我尝试这样做。首先是旧的工作代码:

dl=data.frame(replicate(16,1:15685849))
#in line below mean was sums, but this gave integer overflows. This is not the case in the real dataset, but for the purpose of this example mean will do.
sums<-mapply(mean, dl[,4:ncol(dl)], USE.NAMES=FALSE)
appel<-dl[,1:3]
for (i in 1:(ncol(dl)-3)){
  appel[,i+3]=dl[,i+3]/sums[i]
}

目前没有问题。我试图将这段代码重写为一个函数,这样我就可以制作一个R包供私人使用。这是我的尝试

dl=data.frame(replicate(16,1:15685849))
depthnormalise=function(tonormtable, skipleftcol=3){
    sums<-mapply(mean, dl[,4:ncol(dl)], USE.NAMES=FALSE)
    dn=function(x){x/sums}
    tonormtable[,(skipleftcol+1):ncol(tonormtable)]=t(apply(tonormtable[,(skipleftcol+1):ncol(tonormtable)], 1, dn))
}
appel=depthnormalise(dl)

但是这会耗尽我的内存。

我使用应用程序的经验很少,但我似乎无法正确地找到一个表,我想留下前3列原样,只改变之后的那些。如果需要更多的信息,请在投票前告诉我!

下面是一个可行的apply解决方案:

appel1 <- as.matrix(dl)
appel1[, -(1:3)] <- apply(appel1[, -(1:3)], 2, 
                          function(x) round(x / mean(x) * 1e6, digits=2))
all.equal(as.matrix(appel), appel1)
#[1] TRUE

然而,正如评论中所说,它不会比编写良好的for循环快。

最新更新