如何在R语言中独立对param1、param2两列进行抽样?
独立抽取多列参数样本的data.table修正方案
问题背景
需要从df_sample中为df的每一行(按site和quad分组)独立抽取param1和param2的样本,要求同一site+quad下的两个参数可以交叉组合(而非固定配对),但原代码仅能抽取param1的值,无法满足需求。
原代码问题分析
原代码将param1和param2打包进同一个列表列param,抽样时只能从这个组合列表中选取一个元素,导致只能拿到其中一列的值,且无法实现两个参数的独立抽样。
修正代码
set.seed(501) # 构建目标数据框df month <- rep(c("J","J","J","F","M"), each = 5) site <- rep(c("1","2","3","1","2"), each = 5) quad <- rep(c("1","2","3","4","5"), rep = 5) df <- data.frame(month, site, quad) # 构建样本数据框df_sample site <- rep(c("1","2","3"), each = 20) quad <- c("1","2","3","4","5","1","2","3","4","5","1","2","3","4","5","1","2","3","4","5","1","2","3","4","5","1","2","3","4","5","2","2","3","4","5","1","2","3","4","5","1","2","3","4","5","1","2","3","4","5","1","1","3","4","5","1","1","3","4","5") param1 <- rnorm(60,5,1) param2 <- rnorm(60,500,1) df_sample <- data.frame(site, quad, param1, param2) library(data.table) # 1. 按site+quad分组,分别存储param1和param2的所有样本到独立列表列 dt_sample <- setDT(df_sample)[, .(param1_pool = list(param1), param2_pool = list(param2)), by = .(site, quad) ] # 2. 与df连接,对两个参数池独立抽样 df_result <- setDT(df)[dt_sample, on = .(site, quad)][, `:=`( param1_sample = sapply(param1_pool, sample, size = 1), param2_sample = sapply(param2_pool, sample, size = 1) )][, c("param1_pool", "param2_pool") := NULL] # 清理临时列 # 查看结果 head(df_result)
关键修正点
- 分开存储参数样本池:按
site和quad分组后,为param1和param2分别创建独立的列表列param1_pool和param2_pool,确保两个参数的样本来源完全独立。 - 独立抽样:连接
df后,通过sapply分别对两个样本池进行抽样,实现同一site+quad下param1和param2的交叉组合。 - 清理临时列:抽样完成后移除存储样本池的列表列,得到结构整洁的结果数据框。
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

