将列表列表(包含矩阵)转换为 data.frame

Transform a list of list (containing matrices) into a data.frame

我有一个列表列表,我想将其转换为 data.frame。 “内部”列表中的一些元素包含一个矩阵,我想保留列及其名称。

我使用 lapply 取得了相当大的进步,现在我得到了另一个具有这种模式的列表:

[[1]]
[[1]]$X
[1] 0.100

[[1]]$Y
                   VAL   LCI  UCI  
AB                 1000  500  1300 
CD                 30    10   400 

此模式重复大约 200 行。

现在的问题是我想创建一个包含 4 列的 data.frame:X、VAL、LCI、UCI。显然我会有交替“AB”和“CD”的行,因为这些行名在我的列表中是固定的。

有人知道如何执行此操作吗? 这是一个可重现的例子 - 虽然不花哨,但此代码生成的 list1 正是 我需要在数据帧中转换的对象:

#Create list x
var1 <- 0.100 
var1 <- list(var1)
names(var1) <- "x"

#Create list y
var2 <- matrix(1:6, nrow = 2)
rownames(var2) <- c("AB","CD")
colnames(var2) <- c("VAL","LCI","UCI")
var2 <- list(var2)
names(var2) <- "y"

#Create a second element
var3 <- 0.200
var3 <- list(var3)
names(var3) <- "x"

var4 <- matrix(7:12, nrow = 2)
rownames(var4) <- c("AB","CD")
colnames(var4) <- c("VAL","LCI","UCI")
var4 <- list(var4)
names(var4) <- "y"

#Create a list
list1 <- list(c(var1,var2),c(var3,var4))

不确定我是否完全理解您的要求,但我试一试!因此,根据您的示例,请在下面找到一个 reprex

Reprex

  • 函数代码DFbindRows
DFbindRows <- function(x){
  x <- do.call(rbind, lapply(x, as.data.frame))
  names(x) <- gsub("y.","",names(x))
  return(x)
}
  • 在您的数据上测试函数 list1
DF <- DFbindRows(list1)
#>       x   VAL   LCI   UCI
#> AB  0.1     1     3     5
#> CD  0.1     2     4     6
#> AB1 0.2     7     9    11
#> CD1 0.2     8    10    12

注意:AB 或 CD 后的数字是强制性的,因为在 dataframe

中不允许有重复的行名
  • 检查对象class
class(DF)
#> [1] "data.frame"

reprex package (v2.0.1)

于 2021-11-10 创建

row names 问题的解决方法

为了规避我在上面Nota Bene中指出的问题,可以

  • 创建一个 ID 列,其中行 ABCD 交替,并且
  • 设置数字为row.names

所以,请在下面找到 DFbindRows2 函数,它为您提供了获得这样一个 dataframe

的可能性

Reprex

  • 函数代码DFbindRows2
DFbindRows2 <- function(x){
  x <- do.call(rbind, lapply(x, as.data.frame))
  x$ID <- rep(c("AB", "CD"), nrow(x)/2)
  x <- x[,c("ID", 
            names(x)[-grep("ID",names(x))])]
  row.names(x) <- seq(nrow(x))
  names(x) <- gsub("y.","",names(x))
  return(x)
}
  • 在你的数据列表上测试功能1
DF <- DFbindRows2(list1)
#>   ID   x   VAL   LCI   UCI
#> 1 AB 0.1     1     3     5
#> 2 CD 0.1     2     4     6
#> 3 AB 0.2     7     9    11
#> 4 CD 0.2     8    10    12
  • 检查对象class
class(DF)
#> [1] "data.frame"

reprex package (v2.0.1)

于 2021-11-10 创建