2017-06-15 8 views
-3

私は単純なスクリプトビルドでPDSIの計算に取り組んでいますが、スクリプトを実行するとDTの出力に異なる値が得られます。私はこの計算を手作業で行い、用紙とExcelで両方を検証して正しい値を得ました。IFステートメントの不正確な出力R

ここにスクリプトの抜粋があります。エラーはありませんので、どこにエラーがあるのか​​分かりません。

Tb.PDSI<-as.data.table(matrix(ncol = 22, nrow = 190)) 
colnames(Tb.PDSI)<-c("Anho","Mes","Z","Uw.Z","Ud.Z","V","Ze","Q","P","Ms.X1","AX.1","X1","Ms.X2","AX.2","X2","Ms.X3","AX.3","X3","O","IndeX.f","Dur.Mes","Z3") 


Tb.PDSI<-rbind(data.frame(Anho=1999,Mes=12,Z=0,Uw.Z=0,Ud.Z=0,V=0,Ze=0,Q=0,P=0,Ms.X1=0,AX.1=0,X1=0,Ms.X2=0,AX.2=0, 
        X2=0,Ms.X3=0,AX.3=0,X3=0,O=0,IndeX.f=0,Dur.Mes=0, Z3=0),Tb.PDSI, fill=F) 

mb<-36.03 
mmb<-0.07 
b<-33.58 
mb0<-18.01 
m2<-1.22 

# ...(3) Index Table 
for(i in 2:6){ 
    for(j in 4:21){ 

    # ... Uw.Z 
    if (j == 4){ 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0,0, 
          ifelse(Tb.PDSI$X3[i-1]<0, 
            ifelse(Tb.PDSI$Uw.Z[i-1]==0, 
              ifelse(Tb.PDSI$Z[i]>-m2,Tb.PDSI$Z[i]+m2,0),Tb.PDSI$Z[i]+m2),0)) 
    } else if(j == 5){ # ... Ud.Z 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0,0, 
          ifelse(Tb.PDSI$X3[i-1]>0, 
            ifelse(Tb.PDSI$Ud.Z[i-1]==0, 
              ifelse(Tb.PDSI$Z[i]<m2,Tb.PDSI$Z[i]-m2,0),Tb.PDSI$Z[i]-m2),0)) 
    } else if(j==6){  # ... V 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0,0, 
          ifelse(Tb.PDSI$O[i-1]==1, 
            ifelse(Tb.PDSI$Ud.Z[i]+Tb.PDSI$V[i-1]>0 && Tb.PDSI$P[i-1]<100,0, 
              ifelse(Tb.PDSI$V[i-1]==0 || Tb.PDSI$P[i-1]==100,Tb.PDSI$Ud.Z[i],Tb.PDSI$V[i-1]+Tb.PDSI$Ud.Z[i])), 
            ifelse(Tb.PDSI$Uw.Z[i]+Tb.PDSI$V[i-1]<0 && Tb.PDSI$P[i-1]<100,0, 
              ifelse(Tb.PDSI$V[i-1]==0 || Tb.PDSI$P[i-1]==100,Tb.PDSI$Uw.Z[i],Tb.PDSI$Uw.Z[i]+Tb.PDSI$V[i-1])))) 
    } else if (j==7){ # ... Ze 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0,0, 
          ifelse(Tb.PDSI$X3[i-1]<0 && Tb.PDSI$Z[i]>0,-par.b_n*Tb.PDSI$X3[i-1]-mbO, 
            ifelse(Tb.PDSI$X3[i-1]>0 && Tb.PDSI$Z[i]<0,-par.b_n*Tb.PDSI$X3[i-1]+mbO, 
              ifelse(Tb.PDSI$Ze[i-1]==0,0, 
                ifelse(Tb.PDSI$O[i-1]==1,-par.b_n*Tb.PDSI$X3[i-1]+mbO,-par.b_n*Tb.PDSI$X3[i-1]-mbO))))) 
    } else if (j==8){ # ... Q 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0,0, 
          ifelse(Tb.PDSI$P[i-1]==100,Tb.PDSI$Ze[i],Tb.PDSI$Ze[i]+Tb.PDSI$V[i-1])) 
    } else if (j==9){ # ... P 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$Q[i]==0,0, 
          ifelse(100*Tb.PDSI$V[i]/Tb.PDSI$Q[i]>100,100,100*Tb.PDSI$V[i]/Tb.PDSI$Q[i])) 
    } else if (j==10){ #########  WET DATA ######### 
            # ... Ms.1 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==1 && Tb.PDSI$P[i]<100,0,-Tb.PDSI$X1[i-1]*mmb) 
    } else if (j==11){    # ... AX1 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==1 && Tb.PDSI$P[i]<100,0, 
          ifelse(Tb.PDSI$X1[i-1]==0,0,Tb.PDSI$Z3[i]+Tb.PDSI$Ms.X1[i])) 
    } else if (j==12){    # ... X1 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==1,0, 
          ifelse(ifelse(Tb.PDSI$X1[i-1]==0, 
              ifelse(Tb.PDSI$Z3[i]>0,Tb.PDSI$Z3[i],0),Tb.PDSI$AX.1[i]+Tb.PDSI$X1[i-1])>0, 
            ifelse(Tb.PDSI$X1[i-1]==0, 
              ifelse(Tb.PDSI$Z3[i]>0,Tb.PDSI$Z3[i],0),Tb.PDSI$AX.1[i]+Tb.PDSI$X1[i-1]),0)) 
    } else if (j==13){########  drought data  ######### 
           # ... Ms.2 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]== -1 && Tb.PDSI$P[i]<100,0,Tb.PDSI$X2[i-1]*-mmb) 
    } else if (j==14){   # ... AX2 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==-1 && Tb.PDSI$P[i]<100,0,ifelse(Tb.PDSI$X2[i-1]==0,0,Tb.PDSI$Z3[i]+Tb.PDSI$Ms.X2[i])) 
    } else if (j==15){   # ... X2 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]== -1,0, 
          ifelse(
           ifelse(Tb.PDSI$X2[i-1]==0, 
             ifelse(Tb.PDSI$Z3[i]<0, Tb.PDSI$Z3[i],0),Tb.PDSI$AX.2[i]+Tb.PDSI$X2[i-1])<0, 
           ifelse(Tb.PDSI$X2[i-1]==0, 
             ifelse(Tb.PDSI$Z3[i]<0,Tb.PDSI$Z3[i],0),Tb.PDSI$AX.2[i]+Tb.PDSI$X2[i-1]),0)) 
    } else if (j==16){ ########  Established event ########### 
             # ... Ms.3 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0 || Tb.PDSI$P[i]==100,0,-mmb*Tb.PDSI$X3[i-1]) 
    } else if (j==17){     # ... AX3 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0 || Tb.PDSI$P[i]==100,0,Tb.PDSI$Z3[i]+Tb.PDSI$Ms.X3[i]) 
    } else if (j==18){     # ... X3 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0 || Tb.PDSI$P[i]==100, 
          ifelse(Tb.PDSI$X1[i]>1,Tb.PDSI$X1[i], 
            ifelse(Tb.PDSI$X2[i]<-1,Tb.PDSI$X2[i],0)),Tb.PDSI$X3[i-1]+Tb.PDSI$AX.3[i]) 
    } else if (j==19){ ######## FINAL ############ 
           # ... O 
     Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i-1]==0, 
          ifelse(Tb.PDSI$X1[i]>1,1, 
            ifelse(Tb.PDSI$X2[i]<-1,-1,0)),ifelse(Tb.PDSI$P[i]==100,ifelse(Tb.PDSI$X1[i]>1,1,ifelse(Tb.PDSI$X2[i]<-1,-1,0)),Tb.PDSI$O[i-1])) 
    }else if (j==20){   # ... Final Index 
    Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i]==0, ifelse(Tb.PDSI$X1[i]+Tb.PDSI$X2[i]>0,Tb.PDSI$X1[i],Tb.PDSI$X2[i]),Tb.PDSI$X3[i]) 
    }else if (j==21){   # ... Duracion Meses 
    Tb.PDSI[[i,j]]<-ifelse(Tb.PDSI$O[i]==Tb.PDSI$O[i-1] && abs(Tb.PDSI$O[i])>0, 
          ifelse(Tb.PDSI$O[i-1]==1,Tb.PDSI$Dur.Mes[i-1]+1,Tb.PDSI$Dur.Mes[i-1]-1),Tb.PDSI$O[i]) 
    } 
    } 
} 

これはR

Anho Mes   Z Uw.Z  Ud.Z V  Ze   Q P  Ms.X1  AX.1  X1 Ms.X2 AX.2 X2  Ms.X3  AX.3 
1: 1999 12 0.00000 0 0.000000 0 0.00000 0.00000 0 0.00000000 0.0000000 0.0000000  0 0 0 0.00000000 0.0000000 
2: 2000 1 22.82134 0 0.000000 0 0.00000 0.00000 0 0.00000000 0.0000000 0.6334310  0 0 1 0.00000000 0.0000000 
3: 2000 2 39.40637 0 0.000000 0 0.00000 0.00000 0 -0.04303857 1.0507278 1.6841588  0 0 0 -0.06794515 1.0258212 
4: 2000 3 -16.39223 0 -17.616196 0 -50.01341 -50.01341 0 -0.11443043 -0.5694145 1.1147443  0 0 0 -0.13764473 -0.5926288 
5: 2000 4 -8.35648 0 -9.580449 0 -30.11282 -30.11282 0 -0.07574147 -0.3076846 0.8070597  0 0 0 -0.09737848 -0.3293216 
6: 2000 5 -10.62170 0 -11.845673 0 -19.05413 -19.05413 0 -0.05483579 -0.3496527 0.4574070  0 0 0 -0.07500267 -0.3698196 
      X3 O IndeX.f Dur.Mes   Z3 
1: 0.0000000 0 0.0000000  0 0.0000000 
2: 1.0000000 -1 1.0000000  -1 0.6334310 
3: 2.0258212 -1 2.0258212  -2 1.0937664 
4: 1.4331925 -1 1.4331925  -3 -0.4549841 
5: 1.1038708 -1 1.1038708  -4 -0.2319432 
6: 0.7340512 -1 0.7340512  -5 -0.2948169 

に私の結果であり、これは私がExcelで得た正しいものであると手動

Anho Mes   Z Uw.z  Ud.z   V   Ze   Q   P  Ms.X1  AX1 
1: 1999 12 0.000000 0 0.000000 0.00000 0.000000 0.00000 0.00000 0.00000000 0.000000 
2: 2000 1 22.818904 0 0.000000 0.00000 0.000000 0.00000 0.00000 0.00000000 0.000000 
3: 2000 2 39.402163 0 0.000000 0.00000 0.000000 0.00000 0.00000 -0.04303857 1.050728 
4: 2000 3 -16.390479 0 -17.614317 -17.61432 -38.536210 -38.53621 45.70848 0.00000000 0.000000 
5: 2000 4 -8.355589 0 -9.579427 -27.19374 -19.417198 -37.03152 73.43406 0.00000000 0.000000 
6: 2000 5 -10.620571 0 -11.844410 -39.03815 -9.086188 -36.27993 100.00000 0.00000000 0.000000 
     X1  Ms.X2  AX2   X2  Ms.X3  AX3  X3 O IndeX.f Dur.Mes 
1: 0.000000 0.00000000 0.0000000 0.0000000 0.00000000 0.0000000 0.0000000 0 0.0000000  0 
2: 0.633431 0.00000000 0.0000000 0.0000000 0.00000000 0.0000000 0.0000000 0 0.6334310  0 
3: 1.684159 0.00000000 0.0000000 0.0000000 0.00000000 0.0000000 1.6841588 1 1.6841588  1 
4: 0.000000 0.00000000 0.0000000 -0.4549840 -0.11443043 -0.5694145 1.1147443 1 1.1147443  2 
5: 0.000000 0.03091396 -0.2010292 -0.6560133 -0.07574148 -0.3076846 0.8070597 1 0.8070597  3 
6: 0.000000 0.04457292 -0.2502440 -0.9062573 0.00000000 0.0000000 0.0000000 0 -0.9062573  0 
      Z3 
1: 0.0000000 
2: 0.6334310 
3: 1.0937664 
4: -0.4549840 
5: -0.2319432 
6: -0.2948169 

を確認し、私はドントRは私に間違ったものを与えた理由を知っています値。批評家のための

+1

たスペースifelse(Tb.PDSI$X2[i]<-1、あった、私自身のために問題を解決しました。問題を説明するために、あなたの完全なスクリプトやこの多くのコラムが必要であるとは思わない。 [mcve]とhttps://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank

+1

を参照してください。 Excelは "ゴールドスタンダード"でなければなりません。あなたは明らかに2つの異なるプラットフォームで異なるものを作ってしまっています。アルゴリズムが何であるかを自然言語で説明していないし、Excelワークシートも持っていないので、どちらが正しいかはわかりません。 –

答えて

0

おかげで最終的に私はそれがあるため、正しいあなたは最小限の例を作ることに動作するはずifelse(Tb.PDSI$X2[i]< (-1)

関連する問題