重复一个复杂的序列并将输出放入R中的新数据帧中
我在R相对来说是个新手,我已经工作了一段时间来拼凑一段代码,让我可以比较从一个大数据框中抽取的两个总体的6个变量(由1000倍采样的原始数据组成,并根据pop大小进行替换) 以下是我的数据示例:重复一个复杂的序列并将输出放入R中的新数据帧中,r,dataframe,repeat,R,Dataframe,Repeat,我在R相对来说是个新手,我已经工作了一段时间来拼凑一段代码,让我可以比较从一个大数据框中抽取的两个总体的6个变量(由1000倍采样的原始数据组成,并根据pop大小进行替换) 以下是我的数据示例: head(PhenoM2) ID Name PhenoNames Group HML RML FML TML FHD BIB 1 378607 PaleoAleut PaleoAleut 1 323.5 248.75 434.50 355.
head(PhenoM2)
ID Name PhenoNames Group HML RML FML TML FHD BIB
1 378607 PaleoAleut PaleoAleut 1 323.5 248.75 434.50 355.75 46.84 NA
2 378664 PaleoAleut PaleoAleut 1 NA 238.50 441.50 353.00 45.83 277.0
3 378377 PaleoAleut PaleoAleut 1 309.5 227.75 419.00 332.25 46.39 284.0
4 378463 PaleoAleut PaleoAleut 1 283.5 228.75 397.75 331.00 44.37 255.5
5 378602 PaleoAleut PaleoAleut 1 279.5 230.00 393.00 329.50 45.93 265.0
6 378610 PaleoAleut PaleoAleut 1 307.5 234.25 419.50 338.50 43.98 271.5
我的整个代码,从初始重采样循环到输出,如下所示:
samplesM <- ddply(PhenoM2, .(Group),
function(d) d[sample(1:nrow(d), replace = TRUE),])
n <- 1000
samplesM <- vector("list", n)
for (i in seq_along(samplesM))
samplesM[[i]] <- ddply(PhenoM2, .(Group),
function(d) d[sample(1:nrow(d), replace = TRUE),])
all.samplesM <- do.call(rbind, samplesM)
CovDataM <- all.samplesM[,4:10]
covM <- with(CovDataM, by(CovDataM[,2:7], CovDataM$Group, cov, use = "pairwise.complete.obs", method = "pearson"))
cov.aggregator <- function(K){
out <- array(NA,c(6,6,dim(K)))
for(i in 1:dim(K)){
out[,,i] <- K[[i]]
}
return(out)
}
testmatrix<-cov.aggregator(covM)
covM.pooled<-apply(testmatrix,c(1,2), mean, na.rm = T)
male.means<-aggregate(all.samplesM[,4:10], by = list(all.samplesM$"Group"), FUN = mean, na.rm = T)
cov.mstd.aggregator <- function(K,means){
out <- array(NA,c(6,6,dim(K)))
for(i in 1:dim(K)){
mi <- as.matrix(means[i,])
out[,,i] <- K[[i]]/(mi%*%t(mi))
}
return(out)
}
male.P.mstd <- cov.mstd.aggregator(covM,as.matrix(male.means[,3:8]))
covM.mstd.pooled <- apply(male.P.mstd,c(1,2),mean, na.rm = T)
pooledMmean <- apply(male.means[,3:8],2,mean,na.rm=T)
PointHope<-male.means[7,3:8]
Kikuyu<-male.means[128,3:8]
deltaM1<-(PointHope - Kikuyu)/pooledMmean
Pinv <- ginv(covM.mstd.pooled)
B.Kikuyu.PointHope <- Pinv %*% as.matrix(t(deltaM1))
我的问题如下:我需要整个代码重复10次(从最初的1000x循环到输出),但我不确定如何将所有这些笨拙的代码放入常规的for循环或rep()命令中。然后,我需要10次重复中的每一次的输出进入一个空数据帧
我试着在原始代码的末尾添加这个标记以进行重复,但如果没有[,I],每次我(手动)重复它时,它都会简单地重写Kikuyu.PointHope.df,并且使用[,I]我收到一个错误
Kikuyu.PointHope.df[,i] <- do.call(rbind, as.list(B.Kikuyu.PointHope))
Kikuyu.PointHope.df[,i]发表评论作为答案,OP似乎很满意:-)
如果你问的只是如何重复一堆东西,最简单的方法就是将你发布的所有东西捆绑到一个“包装器”函数中,那么你可以做sapply(1:10,函数(j)my_包装器(你的参数,订阅了第j组数据))
如果你问的只是如何重复一堆东西,最简单的方法是将您发布的所有内容捆绑到一个“包装器”函数中,然后您可以执行sapply(1:10,函数(j)my_包装器(您的_参数,订阅到第j组数据))
谢谢-一旦我知道如何构建包装器,这肯定会有助于重复!但是输出仍然是矩阵数据的同一列-关于如何在一个数据帧中使其成为一行,我可以继续添加输出,有什么想法吗?对于所有的问题,很抱歉,再次感谢您!啊,没关系。我让它工作了。太完美了,再次谢谢你!
Kikuyu.PointHope.df[,i] <- do.call(rbind, as.list(B.Kikuyu.PointHope))