如何在R语言循环输出中打印随机化后的关联参数?
解决方法
你的问题出在函数f只返回了相关系数一个标量,而你在df[, .(rand.cor = f(x,v), x, v), sp]里加的x和v是原数据表的原始列,不是抽样后和y.sample对应的数值。要把抽样后的v.sample、对应的x、y.sample都保留下来,得修改函数让它返回完整的结果集,再整合到最终的result里。
修改后的完整代码如下:
set.seed(333) J <- rnorm(40, 5, 1) x <- rnorm(40, 2, 1) v <- rnorm(40, 10, 1) sp <- rep(c("A", "B", "C", "D"), each=10) df <- data.frame(J, x, v, sp) library(data.table) setDT(df) # 修改函数,返回包含所有需要变量的data.table f <- function(x, v) { v.sample <- sample(v, length(v), replace=TRUE) y.sample <- (v.sample/x^2) - (1/x) rand.cor <- cor(y.sample, x, use="complete.obs") # 返回包含x、抽样后的v、y.sample和相关系数的表 data.table(x = x, v.sample = v.sample, y.sample = y.sample, rand.cor = rand.cor) } # 生成999次迭代的结果 result <- rbindlist( lapply(1:999, function(i) { # 按物种分组运行函数,再添加迭代次数i df[, f(x, v), by = sp][, i := i] }) )
关键改动说明
- 函数
f不再只返回单个相关系数,而是返回一个包含x(原始x,因为你没对x抽样)、v.sample(抽样后的v值)、y.sample(计算出的样本值)、rand.cor(相关系数)的data.table - 在
lapply的每次迭代里,按sp分组调用f,这样每个物种都会单独完成一次抽样计算,然后给每组结果加上当前的迭代序号i - 最终的
result里,每一行对应某一次迭代、某一个物种下的一条观测,包含了你需要的所有变量:物种sp、迭代次数i、原始x、抽样的v.sample、计算出的y.sample、相关系数rand.cor
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

