以下是我的问题示例:
#data#
g<-c(1,1,1,2,2,2)
A<-runif(6,min=1,max=5)
B<-runif(6,min=100,max=1000)
C<-runif(6,min=30,max=31)
D<-runif(6,min=67,max=98765)
var<-cbind(A,B,C,D)
label<-colnames(var)
store<-data.frame(matrix(ncol=2))
colnames(store)=c("usedVar","prediction")
library(MASS)#get lda
for (i in c(1:4))
{
for (k in c(1:4))
{
if(i==k)break()#using the same variable will not work in lda
dis<-lda(g~var[,i]+var[,k],CV=TRUE,fold=6)#linear discriminant function
ct<-table(g,dis$class)
pre<-sum(diag(prop.table(ct)))# Prediction of cv-reclassification
#store the results
a<-i+4*(k-1)
store[a,1]<-paste(label[i],label[k])
store[a,2]<-round(pre,4)
}
}
store
我有两个for-loops被if-break-case“扰乱”(令人不安的意思是,我不需要这些情况的信息)。 通过使用&lt; -i + 4 *(k-1)将结果存储到我的“result”data.frame,破坏案例也将被包括为NA。 有没有办法存储我的循环结果而没有NA-cases来获得连续的数据集?
答案 0 :(得分:0)
您主要需要更改计数器变量a
。而是在循环进行时递增计数器。我还更改了if语句来封装内部循环的整个内容,并将store
预先分配到适当的维度(我认为):
store<-data.frame(matrix(ncol=2,nrow=c(i*k-min(i,k))))
colnames(store)=c("usedVar","prediction")
library(MASS)#get lda
row.i <- 0 # start counter
for (i in c(1:4)) {
for (k in c(1:4)) {
if(i != k) {
row.i <- row.i + 1 # only increment if condition met
dis<-lda(g~var[,i]+var[,k],CV=TRUE,fold=6)#linear discriminant function
ct<-table(g,dis$class)
pre<-sum(diag(prop.table(ct)))# Prediction of cv-reclassification
#store the results
store[row.i,1]<-paste(label[i],label[k])
store[row.i,2]<-round(pre,4)
}
}
}
store