【问题标题】:R: Convert lists into data.frame or matrixR:将列表转换为 data.frame 或矩阵
【发布时间】:2017-12-22 18:23:30
【问题描述】:
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 或矩阵?

【问题讨论】:

    标签: r list matrix dataframe


    【解决方案1】:

    与您的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
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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
      

      【讨论】:

        【解决方案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
        

        【讨论】:

          【解决方案4】:

          另一种方法是使用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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-23
            • 2015-05-27
            • 1970-01-01
            • 2020-07-17
            • 2017-05-23
            • 2015-01-06
            相关资源
            最近更新 更多