【问题标题】:Transform a list of list (containing matrices) into a data.frame将列表列表(包含矩阵)转换为 data.frame
【发布时间】:2021-12-23 09:12:01
【问题描述】:

我有一个列表列表,我想将其转换为 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))

【问题讨论】:

  • 分享一个可重现的例子。
  • @M-- 我添加了一个 reprex - 虽然并不花哨 - 创建一个对象 (list1),这正是我需要在具有 4 列(X、VAL、LCI、 UCI)

标签: r list dataframe dplyr lapply


【解决方案1】:

不确定我是否完全理解您的要求,但我试一试!所以,根据你的例子,请在下面找到一个代表

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(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(DF)
#> [1] "data.frame"

reprex package (v2.0.1) 于 2021 年 11 月 10 日创建

【讨论】:

  • 我认为你可以删除x &lt;-return(x),当你将它分配给DF时它仍然会返回对象
  • 您好@Mike,非常感谢您的建议。我刚刚编辑了我的答案。干杯
  • @userq8957289475,注意:我更新了我的答案,以便列的名称符合预期。在进行此编辑时,Mike 的评论不再适用。如果此答案是您正在寻找的答案,请将其标记为已接受。如果没有,请告诉我出了什么问题。干杯。
猜你喜欢
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多