如何在R中使用lapply从列表的列表中随机选取指定数量元素
用lapply实现按指定数量从嵌套列表抽样的方法
嘿,这个场景我太熟了——单独处理每个子列表没问题,但要把规则批量用lapply落地,核心是要把子列表和对应的抽样数量配对起来遍历,而不是只遍历嵌套列表本身。下面给你两种可行的方案:
方案1:用lapply结合索引遍历
首先你需要先定义好每个子列表对应的抽样数量,比如你需求里的c(1,1,2),然后通过索引同时关联子列表和抽样数量:
# 先定义每个子列表要抽取的元素数量 sample_counts <- c(1, 1, 2) # 用lapply遍历索引,同时获取子列表和对应数量 sampled_result <- lapply(seq_along(my_list_of_lists), function(idx) { # 从第idx个子列表中抽取sample_counts[idx]个元素 sample(my_list_of_lists[[idx]], size = sample_counts[idx], replace = FALSE) })
关键说明:
seq_along(my_list_of_lists)会生成和嵌套列表长度一致的索引序列(比如你的列表有3个子元素,就是1,2,3)- 匿名函数里的
idx会依次取每个索引值,这样就能同时拿到my_list_of_lists[[idx]](当前子列表)和sample_counts[idx](对应抽样数量) - 如果某个子列表的长度小于要抽取的数量(比如子列表只有1个元素但要抽2个),记得把
replace参数改成TRUE,开启有放回抽样,避免报错
方案2:用Map简化写法(和lapply逻辑一致,更简洁)
如果你觉得写索引有点麻烦,Map()函数可以直接配对遍历多个对象,它本质是mapply的简化版,输出格式和lapply完全一致:
sample_counts <- c(1, 1, 2) sampled_result <- Map(function(sub_list, n) sample(sub_list, size = n), my_list_of_lists, sample_counts)
这里Map会自动把my_list_of_lists的每个子列表和sample_counts的每个数值配对,传给匿名函数处理,代码更清爽。
内容的提问来源于stack exchange,提问作者StatsSorceress
相关产品推荐
相关产品推荐

