0

これが私の問題の例です:

    #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

if-break-case によって 2 つの for ループが「妨害」されています (妨害とは、これらのケースの情報が必要ないことを意味します)。結果を「結果」data.frame に格納するために a<-i+4*(k-1) を使用すると、ブレークケースも NA として含まれます。継続的なデータセットを取得するために NA ケースなしでループ結果を保存する方法はありますか?

4

1 に答える 1

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
于 2012-08-15T18:22:01.233 に答える