首页 > 解决方案 > R:如何重新排列列表对象

问题描述

mylist <- list(matrix(c(1, 2, 3, "red", "blue", "green", "apple", "banana", "orange"), ncol = 3, nrow = 3), 
               matrix(c(2, 3, 9, "green", "blue", "green", "apple", "guava", "orange"), ncol = 3, nrow = 3), 
               matrix(c(43, 90, 1, "black", "red", "green", "orange", "watermelon", "orange"), ncol = 3, nrow = 3))
> mylist
[[1]]
     [,1] [,2]    [,3]    
[1,] "1"  "red"   "apple" 
[2,] "2"  "blue"  "banana"
[3,] "3"  "green" "orange"

[[2]]
     [,1] [,2]    [,3]    
[1,] "2"  "green" "apple" 
[2,] "3"  "blue"  "guava" 
[3,] "9"  "green" "orange"

[[3]]
     [,1] [,2]    [,3]        
[1,] "43" "black" "orange"    
[2,] "90" "red"   "watermelon"
[3,] "1"  "green" "orange"   

mylist中,我有 3 个子列表。每个子列表包含一个 3x3 矩阵,其中第一列包含数字,第二列包含颜色,第三列包含水果。

我想重新排列这些子列表,使第一个子列表中的矩阵包含数字,第二个包含颜色,第三个包含水果。也就是说,我希望它看起来像这样:

[[1]]
     [,1] [,2] [,3]
[1,]    1    2   43
[2,]    2    3   90
[3,]    3    9    1

[[2]]
     [,1]    [,2]    [,3]   
[1,] "red"   "green" "black"
[2,] "blue"  "blue"  "red"  
[3,] "green" "green" "green"

[[3]]
     [,1]     [,2]     [,3]        
[1,] "apple"  "apple"  "orange"    
[2,] "banana" "guava"  "watermelon"
[3,] "orange" "orange" "orange"   

我的直觉是用来lapply循环遍历矩阵的列并将它们存储在一个新列表中,但我不确定如何有效地解决这个问题。

标签: rlist

解决方案


您可以绑定、按列拆分并转换回矩阵:

lapply(asplit(do.call(rbind, mylist), 2), matrix, 3)

[[1]]
     [,1] [,2] [,3]
[1,] "1"  "2"  "43"
[2,] "2"  "3"  "90"
[3,] "3"  "9"  "1" 

[[2]]
     [,1]    [,2]    [,3]   
[1,] "red"   "green" "black"
[2,] "blue"  "blue"  "red"  
[3,] "green" "green" "green"

[[3]]
     [,1]     [,2]     [,3]        
[1,] "apple"  "apple"  "orange"    
[2,] "banana" "guava"  "watermelon"
[3,] "orange" "orange" "orange"    

推荐阅读