嵌套lapply比嵌套for循环更长

时间:2018-04-13 16:27:16

标签: r for-loop lapply

我正在使用dataFrame_1中的数据计算分数,并使用嵌套for循环填充400M单元格dataFrame_2。 为了测试我的代码和作业,我创建了模拟数据,其中:

(cellxcl_df)代理dataFrame_1 (cellxcell_df)代理DataFrame_2

从下面的代码中可以看出,嵌套for循环需要1.8分钟来填充数据(cellxcell_df中的1M单元格。)如果是线性的,当将它应用于实际数据时,我将需要等待12小时才能生成下一次与数据的互动。

因为我读过很多次lapply比循环快得多,所以尝试了嵌套的lapply代码。然而,令我惊讶的是,我必须杀死这个过程,因为它已经被采取了>原始for循环时间的10倍。我在嵌套的lapply循环中做错了什么,或嵌套的lapply在时间上都没那么高效?

###create toy dataframes to try the code
```{r}

nm <- c(paste("c", (1:1000), sep=""))

cellxcell_df <- data.frame(matrix(ncol=1000, nrow=1000))
colnames(cellxcell_df) <- nm
rownames(cellxcell_df) <- nm

cellxcl_val <- sample(1:10,10000, replace = TRUE)
cellxcl_df <-data.frame(matrix(cellxcl_val,ncol=1000, nrow=10))
colnames(cellxcl_df) <- nm
```
#####This is the code with for loop
```{r}
start.time <- Sys.time()

for (i in rownames(cellxcell_df)) {
    for (j in colnames(cellxcell_df)) { 
    cellxcell_df[i,j] <- sum(cellxcl_df[, i] == cellxcl_df[, j])
  }
}

end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
```

下面是我尝试用嵌套的lapply循环替换嵌套的for循环

```{r}
start.time <- Sys.time()

lapply(as.list(rownames(cellxcell_df)), function(i){
        lapply(as.list(rownames(cellxcell_df)), function(j){
         cellxcell_df[i,j] <- sum(cellxcl_df[, i] == cellxcl_df[, j])             })
})

end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
```

任何帮助将不胜感激

0 个答案:

没有答案