簡體   English   中英

R:將列表轉換為data.frame或matrix

[英]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

另一種方法是使用purrrflatten函數從列表中剝離層次結構。 所以,

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM