如何按因子(物种sp)分组在循环内运行自定义采样函数?
解决分组内采样问题
当前代码的问题在于将整个数据框的x和v传入函数f,导致采样时跨所有物种混合。要实现按sp分组内采样,需通过data.table的by=sp参数实现分组操作,让每个物种组独立执行采样逻辑。
修改后的完整代码
set.seed(100) x <- c(1,1,1,1,1,1,2,3,4,5,11,11,11,11,11,500,782,234,124,566) v <- c(1,1,1,1,1,1,2,3,4,5,11,11,11,11,11,60,80,123,44,55) sp <- rep(c("A", "B", "C", "D"), each=5) df <- data.frame(x, v, sp) df$sp <- as.factor(df$sp) library(data.table) setDT(df) f <- function(x, v) { v.sample <- sample(v, length(v), replace=TRUE) y.sample <- (v.sample/x^2) - (1/x) per <- cor(y.sample, x, use="complete.obs") data.frame(v.sample = v.sample, y.sample = y.sample, rand.cor = per) } # 核心修改:按sp分组应用函数,再循环生成9次结果 result <- rbindlist( lapply(1:9, function(i) { df[, c(f(x, v), .(x = x, v = v, sp = sp)), by = sp][, i := i] }) )
关键修改说明
by=sp:指定按物种分组,每个分组独立调用f(x, v),确保采样仅在当前物种的v子集内进行。c(f(x, v), .(x = x, v = v, sp = sp)):将函数返回的采样结果与原数据的x、v、sp字段合并,保留分组原始信息。- 循环1-9次生成重复实验结果,每次循环添加
i标记区分不同实验批次。
验证效果
查看物种A的采样结果,确认仅包含组内的1:
result[sp == "A", unique(v.sample)] # 输出:[1] 1
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

