如何基于对应向量值对R中列表内的dataframe做条件子集采样
问题原因
你原先代码不符合预期的核心原因是:purrr::map_if()仅会将你传入的count = a作为整体参数传给调用的函数,不会自动按迭代位置取a的对应值,因此所有符合a>0条件的dataframe采样时都只会用a的第一个元素3作为采样行数。
可行实现方案
方案1:使用purrr::map2()并行遍历列表和向量(最简便)
map2()支持并行遍历两个长度相同的输入,刚好可以同时取列表中的dataframe和a的对应位置值,完美匹配你的需求:
library(purrr) # 自定义处理逻辑 process_df <- function(df, sample_count) { if (sample_count > 0) { # 采样指定行数 df[sample(nrow(df), sample_count), ] } else { # 小于等于0返回原数据 df } } # 逐位对应处理 result <- map2(l, a, process_df)
运行后的输出和你给出的期望结构完全一致。
方案2:遍历索引实现(无额外依赖)
如果不想依赖purrr包,也可以通过遍历列表索引的方式取值,逻辑更直观:
result <- lapply(seq_along(l), function(i) { current_df <- l[[i]] current_a <- a[i] if (current_a > 0) { current_df[sample(nrow(current_df), current_a), ] } else { current_df } })
内容的提问来源于stack exchange,提问作者xilliam
相关产品推荐
相关产品推荐

