如何在R中的列表中对矩阵进行子集化?

时间:2018-05-27 23:42:54

标签: r

目前,我有一个包含500个元素的列表,名为List.500。在每个列表中,我有3个向量和1个矩阵。第一个要素是:

> List.500[[1]]
$two_values
$two_values$bin
[1] 0 1

$grid_points$grid
 [1] 0.05000000 0.06836735 0.08673469 0.10510204 0.12346939 0.14183673 0.16020408
 [8] 0.17857143 0.19693878 0.21530612 0.23367347 0.25204082 0.27040816 0.28877551



$mean_0
 [1] 14.48597 14.49662 14.51089 14.52915 14.55242 14.58129 14.61866 14.66572 14.72186
[10] 14.79531 14.88589 14.99356 15.13048 15.29701 

$mean_1
 [1] 16.48597 16.49662 16.51089 16.52915 16.55242 16.58129 16.61866 16.66572 16.72186
[10] 16.79531 16.88589 16.99356 17.13048 17.29701 

$mean_grid
      g=0.05   g=0.07   g=0.09   g=0.11   g=0.12   g=0.14   g=0.16   g=0.18    g=0.2
bin=0 14.48597 14.49662 14.51089 14.52915 14.55242 14.58129 14.61866 14.66572 14.72186
bin=1 16.48597 16.49662 16.51089 16.52915 16.55242 16.58129 16.61866 16.66572 16.72186
      g=0.22   g=0.23   g=0.25   g=0.27   g=0.29    
bin=0 14.79531 14.88589 14.99356 15.13048 15.29701 
bin=1 16.79531 16.88589 16.99356 17.13048 17.29701 

我想仅从2个向量中的每个向量(不包括名为two_values$bin的第一个向量和1个矩阵(第1列,第2列,第3列)中的第1个,第2个和第3个元素进行子集化List.500的500个元素。我想单独留下two_values$bin

理想情况下,我想得到:

> List.500[[1]]
$two_values
$two_values$bin
[1] 0 1

$grid_points$grid
 [1] 0.05000000 0.06836735 0.08673469

$mean_0
 [1] 14.48597 14.49662 14.51089

$mean_1
 [1] 16.48597 16.49662 16.51089

$mean_grid
      g=0.05   g=0.07   g=0.09
bin=0 14.48597 14.49662 14.51089
bin=1 16.48597 16.49662 16.51089

代表List.500中的每个元素。有没有一种简单的方法可以做到这一点,而无需分手拆分和循环?感谢。

1 个答案:

答案 0 :(得分:2)

如评论所述,您可以使用rapply。我认为列表中的元素遵循一种模式,但为了演示的目的,我使用了以下数据。

set.seed(123)
List.500 <- lapply(1:3, function(x) list(two_values = list(bin = 0:1),
                 grid_points = list(grid = runif(16, 0,.3)),
                 mean_0 = runif(14, 14, 16),
                 mean_1 = runif(14, 16, 18),
                 mean_grid = matrix(runif(28, 14, 18), nrow = 2, byrow = TRUE)))

以下代码将完全符合您的要求。

rapply(List.500, 
       function(x) {if(is.matrix(x)) {x[,1:3]} else {
         if(length(x) == 2) {x} else {x[1:3]}
         }}, 
       how = "replace")