我是一个新用户,对于R和for循环并不熟悉。我正在尝试从数据中进行抽样,并检查是否存在共线性列。我想在该迭代中记录共线性列的存在,并将其记录在向量(baditr)中。同时,我想打印一条指示“共线性出现在第i次迭代”的线路。然后,我希望代码跳转到第二次迭代并继续运行。对于每个迭代,我希望代码保存相应行的列之和到矩阵中。
我的问题是,在错误的迭代中得到了NA。我想要的是不包括错误的迭代在我的矩阵中。以下是我的代码:
我将得到以下输出:
我希望我的矩阵长成这个样子:
作为一种故障保护措施,如果您有关于将某个数量的迭代保存到文件中的任何信息(例如50次迭代),我也会感激。这样,在产生下一个迭代数之前,我可以覆盖它。也就是说,我将前50次迭代保存到文件中,然后再产生第二轮50次迭代时,它们将覆盖第一轮,结果我的文件现在有100次迭代。
对于冗长的帖子我们深表歉意,但不胜感激。
我的问题是,在错误的迭代中得到了NA。我想要的是不包括错误的迭代在我的矩阵中。以下是我的代码:
a0=rep(1,40)
a=rep(0:1,20)
b=c(rep(1,20),rep(0,20))
c0=c(rep(0,12),rep(1,28))
c1=c(rep(1,5),rep(0,35))
c2=c(rep(1,8),rep(0,32))
c3=c(rep(1,23),rep(0,17))
da=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7)
sing <- function(nrw){
sm <- matrix(NA,nrow=nrw,ncol=ncol(da))
baditr <- NULL
for(i in 1:nrw){
ind <- sample(1:nrow(da), nrow(da),replace =TRUE)
smdat <- da[ind,]
evals <- eigen(crossprod(smdat))$values
if(any(abs(evals) < 1e-7)){
baditr <- c(baditr,i)
cat("singularity occurs at", paste(i),"\n")
next
}
sm[i,] <- apply(smdat,2,sum)
}
return(sm)
}
sing(20)
我将得到以下输出:
singularity occurs at 9
singularity occurs at 13
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 40 23 22 25 5 8 26
[2,] 40 20 18 30 4 7 22
[3,] 40 19 24 28 6 7 25
[4,] 40 19 22 30 6 9 26
[5,] 40 12 26 26 8 13 30
[6,] 40 17 16 27 7 10 19
[7,] 40 20 17 33 3 5 19
[8,] 40 22 19 28 4 9 23
[9,] NA NA NA NA NA NA NA
[10,] 40 21 24 28 3 6 27
[11,] 40 21 16 31 2 4 22
[12,] 40 21 21 26 3 6 23
[13,] NA NA NA NA NA NA NA
[14,] 40 18 16 29 2 7 22
[15,] 40 24 18 30 6 9 21
[16,] 40 23 18 29 4 8 21
[17,] 40 17 25 25 3 8 29
[18,] 40 22 28 23 9 14 30
[19,] 40 25 23 25 7 11 30
[20,] 40 20 23 27 7 10 26
我希望我的矩阵长成这个样子:
singularity occurs at 9
singularity occurs at 13
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 40 23 22 25 5 8 26
[2,] 40 20 18 30 4 7 22
[3,] 40 19 24 28 6 7 25
[4,] 40 19 22 30 6 9 26
[5,] 40 12 26 26 8 13 30
[6,] 40 17 16 27 7 10 19
[7,] 40 20 17 33 3 5 19
[8,] 40 22 19 28 4 9 23
[10,] 40 21 24 28 3 6 27
[11,] 40 21 16 31 2 4 22
[12,] 40 21 21 26 3 6 23
[14,] 40 18 16 29 2 7 22
[15,] 40 24 18 30 6 9 21
[16,] 40 23 18 29 4 8 21
[17,] 40 17 25 25 3 8 29
[18,] 40 22 28 23 9 14 30
[19,] 40 25 23 25 7 11 30
[20,] 40 20 23 27 7 10 26
作为一种故障保护措施,如果您有关于将某个数量的迭代保存到文件中的任何信息(例如50次迭代),我也会感激。这样,在产生下一个迭代数之前,我可以覆盖它。也就是说,我将前50次迭代保存到文件中,然后再产生第二轮50次迭代时,它们将覆盖第一轮,结果我的文件现在有100次迭代。
对于冗长的帖子我们深表歉意,但不胜感激。
NA
值的sm
,那么return(na.omit(sm))
就可以解决问题。 - mnel