在 R 中复制后从列表中的列表绑定

bbind from a list inside a list after replication in R

我正在尝试使用 replicate 函数在 R 中复制一个实验 n=5 次。代码如下:

library(glmnet)
library(coefplot)

code <- replicate(10,{
  data<-matrix(rnorm(100*5,mean=0,sd=1), 100, 5) 
  colnames(data) <- c("X1", "X2", "X3", "X4", "X5")
  data <- as.data.frame(data)
  a <- 5 
  b <- 0.8
  c <- 100
  
  data[,2] <- a*data[,1] - b*rnorm(c)
  data[,3] <- a*data[,1] + b*rnorm(c)
  data[,4] <- a*data[,1] - b*rnorm(c)
  
  A <- as.matrix(data)
  set.seed(1)
  results <- lapply(seq_len(ncol(A)), function(i) {
    list(
      cvfit = cv.glmnet(A[, -i] , A[, i] , standardize = TRUE , type.measure = "mse" , nfolds = 10 , alpha = 1)
    )
  })
  
  lam <- as.data.frame(`names<-`(
    lapply(results, function(x) (x$cvfit$lambda.min)), 
    paste0("X", seq_along(results))
  ))
  
  sigma<- matrix(rnorm(1*5,mean=0,sd=1), 1, 5) 
  colnames(sigma) <- c("X1", "X2", "X3", "X4", "X5")
  sub1.sigma <- subset(sigma, select = sigma <= sum(lam))
  sub2.sigma <- subset(sigma, select = sigma <= 2*sum(lam))
  sub3.sigma <- subset(sigma, select = sigma <= 3*sum(lam))
  dplyr::lst(sigma, sub1.sigma, sub2.sigma, sub3.sigma)
  
}, simplify = FALSE)

这导致在环境中调用 codelist。此列表包含 10 个列表,每个列表有 4 个 doublesigmasub1.sigmasub2.sigmasub3.sigma。我想创建 4 个数据帧(sigma, sub1.sigma,... 每个都包含每个 运行 中每个 Xi 的值,并且当不存在值时(因为我正在子集化)显示 NA,如下面的

X1    X2    X3    X4    X5 
0.83  0.83  0.83  0.83  0.83
0.33  0.33  0.33  0.33  NA
0.46  NA    0.46  0.46  0.46
0.22  0.22  NA    0.22  0.22
0.57  0.57  0.57  0.57  0.57

我在建议后尝试使用以下

result <- lapply(purrr::transpose(code), function(x) do.call(rbind, x))

但是显示错误Error in rbind(deparse.level, ...) : numbers of columns of arguments do not match。有人可以帮我解决吗?

这里有一个选项bind_rows

library(dplyr)
library(purrr)
map_dfr(code, ~ bind_rows(Filter(function(x) ncol(x) > 0,
         map(.x, as_tibble))))

如果我们想transpose

transpose(code) %>% 
   map_dfr(~ keep(.x, ~ ncol(.) > 0) %>% 
        map_dfr(as_tibble), .id = 'grp')%>%
     filter(grp %in% 'sigma')