R语言如何对列表内多个样地按不同样本量分别随机抽样
问题背景
- 现有一套涵盖89个不同地面面积(含0.16ha、1ha、2.5ha等规格)样地的森林树木清查数据集。为满足分析适配要求,需以面积最小的0.16ha样地为基准,按公式
大样地种群数量 * 最小样地面积/大样地面积推算各大样地的预期种群规模,再从大样地中随机抽取对应数量的样本,不同大样地对应的预期抽样量存在差异。 - 目前已实现对列表中所有样地统一抽取固定数量样本的功能,但在修改代码实现不同样地抽取不同样本量时遇到困难。
现有可运行代码
当前代码已实现从拆分后的样地列表data_split的每个样地中,无放回随机抽取5个元素的功能,代码如下:
# 导入树木数据 species_data <- read.csv("stackoverflow_help.csv", header = TRUE, stringsAsFactors = FALSE) # 将数据集按样地拆分为列表 data_split <- split(species_data , f = species_data$Plot) library(dplyr) # 定义抽样函数:从单个样地中无放回抽取5个个体 fun2<- function (filename) { sample_n(filename, size=5, replace=F) } # 对所有样地应用抽样函数 sorting <- lapply(data_split, fun2)
具体需求
需要修改循环中固定的size=5参数,设置样本量向量为sizes <- c(4, 6, 8, 4, 10),实现从L2P1、L2P2、L2P3、L3P1、L3P2样地中分别抽取4、6、8、4、10个元素的效果。
代码调整方案
核心逻辑:原代码使用的
lapply仅支持对单个列表元素依次遍历,要实现每个元素匹配独立的参数值,改用支持多参数并行遍历的Map函数即可。需要注意:sizes向量的顺序必须和data_split列表内样地的排列顺序完全一致,避免出现样地和抽样量错配的问题。
调整后的完整代码:
library(dplyr) # 导入数据 species_data <- read.csv("stackoverflow_help.csv", header = TRUE, stringsAsFactors = FALSE) # 按样地拆分数据集 data_split <- split(species_data, f = species_data$Plot) # 按data_split中样地的排列顺序,设置对应抽样量 sizes <- c(4, 6, 8, 4, 10) # 并行遍历样地列表和抽样量向量,完成差异化抽样 sorting <- Map(function(plot_data, sample_size) { sample_n(plot_data, size = sample_size, replace = FALSE) }, data_split, sizes)
扩展提示:如果后续要适配全量89个样地的自动计算场景,不需要手动录入sizes向量,可以提前整理每个样地的面积属性,在遍历过程中直接按给定公式计算每个样地对应的抽样量传入即可,效率更高也不易出错。
内容的提问来源于stack exchange,提问作者Geo_CJ
相关产品推荐
相关产品推荐

