[英]R: Convert lists into data.frame or matrix
mylist = list(list(c(1, 2, 3, 4, 5), c(2, 3, 9)), list(c(1, 4, 2, 1, 3), c(2, 4, 3)))
> mylist
[[1]]
[[1]][[1]]
[1] 1 2 3 4 5
[[1]][[2]]
[1] 2 3 9
[[2]]
[[2]][[1]]
[1] 1 4 2 1 3
[[2]][[2]]
[1] 2 4 3
我有一個列表(或列表中的列表),其中第一個元素是5個值的向量,第二個元素是3個值的向量。 我希望我的輸出類似於
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 4 2 1 3
對於第一個元素和
[,1] [,2] [,3]
[1,] 2 3 9
[2,] 2 4 3
對於第二個元素。
我嘗試過使用do.call(rbind, mylist)
但由於我有多個元素,所以似乎沒有用。 有什么方法可以將此列表轉換為2個data.frames或matrices?
嘗試這個:
firstm<-sapply(X = mylist,"[[",1,simplify = T)
secondm<-sapply(X = mylist,"[[",2,simplify = T)
當您提供simplify = T
參數時,這將為您提供兩個矩陣。 要獲得所需的格式,可以使用t()
進行轉置。
#> firstm
# [,1] [,2]
#[1,] 1 1
#[2,] 2 4
#[3,] 3 2
#[4,] 4 1
#[5,] 5 3
firstm<-t(firstm)
#> firstm
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 4 2 1 3
與你的do.call
如此接近。 在列表對象上調用Map
,使用rbind
作為函數:
do.call(Map, c(rbind, mylist))
#[[1]]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 4 2 1 3
#[[2]]
# [,1] [,2] [,3]
#[1,] 2 3 9
#[2,] 2 4 3
這是使用tidyverse
的選項
library(tidyverse)
mylist %>%
transpose %>%
map(unlist) %>%
map(matrix, nrow=2, byrow = TRUE)
#[[1]]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 4 2 1 3
#[[2]]
# [,1] [,2] [,3]
#[1,] 2 3 9
#[2,] 2 4 3
另一種方法是使用purrr
的flatten
函數從列表中剝離層次結構。 所以,
y <- flatten(mylist)
do.call(rbind, y[c(1,3)])
do.call(rbind, y[c(2,4)])
輸出:
> do.call(rbind, y[c(1,3)])
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 4 2 1 3
> do.call(rbind, y[c(2,4)])
[,1] [,2] [,3]
[1,] 2 3 9
[2,] 2 4 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.