将列表列表(包含矩阵)转换为 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 列,其中行
AB
和 CD
交替,并且
- 设置数字为
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 创建
我有一个列表列表,我想将其转换为 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 列,其中行
AB
和CD
交替,并且 - 设置数字为
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 创建