如何解决R迭代数据集生成
我想基于存储在data.frames
字符串中的21个参数,使用两个变量(使用mvrnorm
)生成21个随机正态分布[1:21] num/chr
。另外,每个data.frame应该包含两列,每列的字符串对于21组中的每组都是相同的(一旦我将它们rbind
一起使用,就有意义了)
假设 AGQ.mu2.mat 存储第一个变量的平均值(stddev = 1),存储 Std.mu2.mat 存储第二个变量(stddev = 20),和 ORIG 和 ID 存储两个字符串(我用一些LotR名称替换了数据),然后将 corr 设置为.30和 n 始终为300:
r<-0.30
ORIG<-c("Ang","Ang","DGu","Har","Isg","Mor","MMo","Rhu","Rhu")
ID<-c("a","b","c","a","c")
AGQ.mu2.mat <- c(-1.06,-1.27,-1.97,-3.27,-3.32,-2.32,-1.05,-0.36,-1.85,-2.30,-2.49,-2.90,-0.80,-0.62,-0.56,1.22,1.62,0.44,-1.43,-1.08,-2.34)
Std.mu2.mat <- c(107,100,102,124,118,120,147,152,141,154,160,155,125,123,116,103,106,107,126,117)
我要迭代
dt<-data.frame(mvrnorm(n=300,mu=c(AGQ.mu2.mat[1],Std.mu2.mat[1]),Sigma=matrix(c(1,r*20,(20^2)),nrow=2),empirical=TRUE))
dt<-rename(dt,"AGQ" = "X1","Std" = "X2")
dt$Herkunft<-ORIG[1]
dt$Bat_ID<-ID[1]
在参数向量的所有21个条目上生成21个唯一命名的数据帧。
我尝试过
for (i in 1:21)
{
dt<-data.frame(mvrnorm(n=300,mu=c(AGQ.mu2.mat[i],Std.mu2.mat[i]),"Std" = "X2")
dt$Herkunft<-ORIG[i]
dt$Bat_ID<-ID[i]
}
和
dt<-data.frame(mvrnorm(n=300,mu=c(rep(AGQ.mu2.mat,each=1),rep(Std.mu2.mat,each=1)),"Aggr" = "X1","Std" = "X2")
dt$Herkunft<-rep(ORIG,each=1)
dt$Bat_ID<-rep(ID,each=1)
无济于事;即使这样,也可以一遍又一遍地生成相同的数据集,而无需创建唯一命名的新数据集。
我非常感谢您提供任何有关迭代的帮助或方法。预先感谢!
解决方法
您需要使用某种方式来收集结果。我选择使用附加的list
。其他解决方案可能是使用rbind
。您必须使用nrow / ncol参数来调整矩阵形状。
library(MASS)
r<-0.30
ORIG<-c("Ang","Ang","DGu","Har","Isg","Mor","MMo","Rhu","Rhu")
ID<-c("a","b","c","a","c")
AGQ.mu2.mat <- 1:21
Std.mu2.mat <- 1:21
results <- list()
for (i in 1:21) {
dt<-data.frame(mvrnorm(n=300,mu=c(AGQ.mu2.mat[i],Std.mu2.mat[i]),Sigma=matrix(c(1,r*20,(20^2)),nrow = 2),empirical=TRUE))
colnames(dt) <- c("AGQ","Std")
dt$Herkunft<-ORIG[i]
dt$Bat_ID<-ID[i]
results[[i]] <- dt
}
加入所有结果
do.call(rbind,results)
验证:
> cor(results[[1]][,1:2]);apply(results[[1]][,1:2],2,mean);apply(results[[1]][,sd)
AGQ Std
AGQ 1.0 0.3
Std 0.3 1.0
AGQ Std
1 1
AGQ Std
1 20
,
使用dplyr
和purrr
的解决方案可能会有所帮助...
library(MASS)
library(dplyr)
library(purrr)
r <-0.30
ORIG<-c("Ang","Rhu")
ID<-c("a","c")
AGQ.mu2.mat <- c(-1.06,-1.27,-1.97,-3.27,-3.32,-2.32,-1.05,-0.36,-1.85,-2.30,-2.49,-2.90,-0.80,-0.62,-0.56,1.22,1.62,0.44,-1.43,-1.08,-2.34)
Std.mu2.mat <- c(107,100,102,124,118,120,147,152,141,154,160,155,125,123,116,103,106,107,126,117)
listofdf <- purrr::map2(AGQ.mu2.mat,Std.mu2.mat,~ data.frame(MASS::mvrnorm(n = 300,mu=c(.x,.y),Sigma = matrix(c(1,nrow=2),empirical=TRUE))
) %>%
purrr::map2(ORIG,~ mutate(.x,Herkunft = .y)) %>%
purrr::map2(ID,Bat_ID = .y))
head(listofdf[[4]])
#> X1 X2 Herkunft Bat_ID
#> 1 0.4329040 17.616240 DGu a
#> 2 2.6589457 -9.385099 DGu a
#> 3 2.3626722 9.815020 DGu a
#> 4 1.8998816 -24.551505 DGu a
#> 5 0.2506713 0.792565 DGu a
#> 6 3.4961960 8.112878 DGu a
### since you mentioned binding them all together
onebigdf <- bind_rows(listofdf)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。