基于另一个列表中的数字的矩阵列表的样本行

Sample rows of a list of matrices based on numbers from another list

我有一个矩阵列表,我想根据另一个列表的数字从中随机抽取行。这是矩阵列表:

x <- list(`1` = matrix(1:20, nrow=10), `2` = matrix(1:20, nrow=10))

这是号码列表

y <- list(`1` = 2, `2` = 3) #for `1` I want to draw 2 rows and for `2` I want to draw 3 rows

最终列表如下所示:

$`1`
      [,1] [,2]
 [1,]    1   11
 [2,]    6   16

$`1`
      [,1] [,2]
 [1,]    1   11
 [2,]    7   17 
 [3,]    9   19

如何在 base R 中实现这一点?感谢您的帮助!

我们可以在 base R 中使用 Map - 遍历 'x' 的相应 list 元素并 'y' 对 [=16= 的行进行采样'x' 中的 ] 基于 'y'

中的值
Map(function(u, v) u[sample(seq_len(nrow(u)), v),], x, y)
$`1`
     [,1] [,2]
[1,]    9   19
[2,]    6   16

$`2`
     [,1] [,2]
[1,]    3   13
[2,]    8   18
[3,]    5   15

或使用 map2 来自 purrr

library(purrr)
map2(x, y,  ~ .x[sample(seq_len(nrow(.x)), .y), ])

如果我们转换成tibble,那么slice_sample也可以使用

library(dplyr)
library(tibble)
map2(x, y,  ~ .x %>% 
   as.data.frame %>%
   as_tibble %>% 
   slice_sample(n = .y))
$`1`
# A tibble: 2 × 2
     V1    V2
  <int> <int>
1     4    14
2     7    17

$`2`
# A tibble: 3 × 2
     V1    V2
  <int> <int>
1     8    18
2     6    16
3     9    19