优化循环以使用 lapply 或在 R 中应用来组合列表中的项目
optimize the loop to combine items from a list using lapply or sapply in R
我以下面的列表为例:
>lista
[[1]]
row col
[1, ] 4 453
[2, ] 5 453
[[2]]
row col
[1, ] 26 264
[2, ] 26 265
[3, ] 26 266
[4, ] 27 265
[5, ] 27 266
[[3]]
row col
[1,] 35 364
[1,] 35 365
[2,] 35 366
目标是将list的元素进行组合,形式为:list[[1]]与list[[2]],list[[1]]与list[[3]]相继(我有一个包含五千个或更多项目的列表)
预期结果是:
[[1]]
row col
[1, ] 4 453
[2, ] 5 453
[3, ] 26 264
[4, ] 26 265
[5, ] 26 266
[6, ] 27 265
[7, ] 27 266
[[2]]
row col
[1, ] 4 453
[2, ] 5 453
[3, ] 35 364
[4, ] 35 365
[5, ] 35 366
.
.
.
所以,我有以下功能,效果很好,但由于列表中的项目数非常多,这个过程需要很长时间。
rows_bind <- function(all_GG){
nn_GG <- length(all_GG)
lista_analizar <- list()
cont <- 1
repeat {
lista_analizar[[cont]] <- rbind(all_GG[[1]], all_GG[[cont+1]])
cont = cont + 1
if (cont == nn_GG){
break
}
}
return(lista_analizar)
}
我的问题是:如何优化这个功能?在 lapply() 或 sapply() 等函数中使用它。或者更好的是使用 parSapply() 或 parLapply()
在循环中增长对象大多效率低下。尝试 Map
/lapply
:
result <- Map(rbind, lista[1], lista[-1])
使用 lapply
你可以这样写:
result <- lapply(lista[-1], function(x) rbind(lista[[1]], x))
这个有用吗:
> lista <- list(matrix(c(4,5,453,453),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col'))),
+ matrix(c(26,26,26,27,27,264,265,266,265,266),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col'))),
+ matrix(c(35,35,35,364,365,366),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col')))
+ )
>
>
> lapply(seq(2,length(lista)), function(i) do.call(rbind, c(lista[1], lista[i])))
[[1]]
row col
[1,] 4 453
[2,] 5 453
[3,] 26 264
[4,] 26 265
[5,] 26 266
[6,] 27 265
[7,] 27 266
[[2]]
row col
[1,] 4 453
[2,] 5 453
[3,] 35 364
[4,] 35 365
[5,] 35 366
>
我以下面的列表为例:
>lista
[[1]]
row col
[1, ] 4 453
[2, ] 5 453
[[2]]
row col
[1, ] 26 264
[2, ] 26 265
[3, ] 26 266
[4, ] 27 265
[5, ] 27 266
[[3]]
row col
[1,] 35 364
[1,] 35 365
[2,] 35 366
目标是将list的元素进行组合,形式为:list[[1]]与list[[2]],list[[1]]与list[[3]]相继(我有一个包含五千个或更多项目的列表)
预期结果是:
[[1]]
row col
[1, ] 4 453
[2, ] 5 453
[3, ] 26 264
[4, ] 26 265
[5, ] 26 266
[6, ] 27 265
[7, ] 27 266
[[2]]
row col
[1, ] 4 453
[2, ] 5 453
[3, ] 35 364
[4, ] 35 365
[5, ] 35 366
.
.
.
所以,我有以下功能,效果很好,但由于列表中的项目数非常多,这个过程需要很长时间。
rows_bind <- function(all_GG){
nn_GG <- length(all_GG)
lista_analizar <- list()
cont <- 1
repeat {
lista_analizar[[cont]] <- rbind(all_GG[[1]], all_GG[[cont+1]])
cont = cont + 1
if (cont == nn_GG){
break
}
}
return(lista_analizar)
}
我的问题是:如何优化这个功能?在 lapply() 或 sapply() 等函数中使用它。或者更好的是使用 parSapply() 或 parLapply()
在循环中增长对象大多效率低下。尝试 Map
/lapply
:
result <- Map(rbind, lista[1], lista[-1])
使用 lapply
你可以这样写:
result <- lapply(lista[-1], function(x) rbind(lista[[1]], x))
这个有用吗:
> lista <- list(matrix(c(4,5,453,453),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col'))),
+ matrix(c(26,26,26,27,27,264,265,266,265,266),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col'))),
+ matrix(c(35,35,35,364,365,366),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col')))
+ )
>
>
> lapply(seq(2,length(lista)), function(i) do.call(rbind, c(lista[1], lista[i])))
[[1]]
row col
[1,] 4 453
[2,] 5 453
[3,] 26 264
[4,] 26 265
[5,] 26 266
[6,] 27 265
[7,] 27 266
[[2]]
row col
[1,] 4 453
[2,] 5 453
[3,] 35 364
[4,] 35 365
[5,] 35 366
>