You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:21:25