R语言如何从嵌套列表中随机抽取元素并获取其两级位置信息
解决方案
实现思路
- 先统计列表中每个子对象的总元素数量,所有子对象的总元素数之和作为抽样总池大小
- 以每个子对象的元素数占总池的比例为权重,随机抽取1个目标子列表的序号,保证每一个底层元素被抽中的概率均等
- 在选中的子对象中随机抽取1个元素的位置索引,直接返回对应的子列表序号、子对象内索引、对应元素值,即可完全区分相同数值的不同位置
代码实现
# 封装为可直接调用的函数 sample_from_nested_list <- function(input_list) { # 计算每个子对象的元素总个数 elem_counts <- sapply(input_list, length) # 按元素数量权重抽样,选中目标子列表序号 selected_list_idx <- sample(seq_along(input_list), size = 1, prob = elem_counts) # 提取选中的子对象 selected_sub <- input_list[[selected_list_idx]] # 抽样得到子对象内的元素序号 selected_elem_idx <- sample(seq_along(selected_sub), size = 1) # 结构化返回结果 return( list( 子列表序号 = selected_list_idx, 子对象内元素序号 = selected_elem_idx, 元素值 = selected_sub[selected_elem_idx] ) ) }
# 用你提供的示例列表测试 example_list <- list(c(1,2,3,4),c(1,0,0,0,1),matrix(1:12,3,4),matrix(1:12,4,3)) # 调用函数测试,set.seed用于固定可复现结果,实际使用可删除 set.seed(123) sample_from_nested_list(example_list)
运行返回示例:
$子列表序号 [1] 3 $子对象内元素序号 [1] 8 $元素值 [1] 8
补充说明
如果子对象为矩阵时你需要获取元素对应的行列坐标,可以对返回的子对象内序号使用arrayInd()函数转换:
# 示例:将矩阵的线性索引转为行列号 selected_sub <- example_list[[3]] arrayInd(8, dim(selected_sub)) # 返回结果为行号3、列号3,和R矩阵默认按列存储的规则一致
内容的提问来源于stack exchange,提问作者MD_Yang
相关产品推荐
相关产品推荐

