从 R 中的列表中采样元素

Sampling an element from a list in R

我有一个名为 MyList 的列表,如下所示:

[[1]]
[1] 5

[[2]]
integer(0)

[[3]]
[1]  5 16

[[4]]
[1] 9

[[5]]
integer(0)

我想对数字 5、5、16、9 之一以及它来自哪个列表元素进行采样。例如。如果选择前 5 个,我希望样本结果为 c(1,5),但如果选择第二个 5,我希望结果为 c(3,5)。我也不想在采样中包含空值 integer(0)

一种方法是将此列表放入更易于管理的数据结构(如矩阵或数据框)中,删除空值。

mat <- unname(do.call(rbind, Map(function(x, y) 
               if(length(y)) cbind(x, y), seq_along(MyList), MyList)))
mat
#      [,1] [,2]
#[1,]    1    5
#[2,]    3    5
#[3,]    3   16
#[4,]    4    9

然后 select 矩阵中的任意一行。

mat[sample(nrow(mat), 1),] 

数据

MyList <- list(5, integer(0), c(5, 16), 9, integer(0))