2017-06-15 2 views
-3

Je travaille sur le calcul de PDSI avec un script simple construit par moi-même, mais quand j'ai exécuté le script, j'ai une valeur différente dans les sorties dans le DT. J'ai fait tout ce calcul manuellement dans et feuille de papier et aussi dans Excel et vérifié les deux et j'obtiens les valeurs correctes.Sortie incorrecte dans IF Instruction dans R

Voici un extrait du script et je n'ai eu aucune erreur donc je ne sais pas où est mon erreur.

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]) 
    } 
    } 
} 

Ceci est mon résultat dans 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 

Ceci est la bonne, je suis arrivé dans Excel et vérifié manuellement

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 

Je sais pourquoi ne pas R m'a donné les incorrectes valeurs.

+1

Vous devriez travailler à faire un exemple minimal. Je doute que vous ayez besoin de votre script complet ou de ce nombre de colonnes pour illustrer le problème. Voir [mcve] et https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank

+1

Vous nous avez donné aucune raison de penser que votre code dans Excel devrait être un "gold standard". Vous avez clairement fait quelque chose de différent sur deux plates-formes différentes et nous ne pouvons pas savoir lequel est correct (puisque vous n'avez pas expliqué en langage naturel ce que l'algorithme pourrait être et nous n'avons pas non plus la feuille de calcul Excel. –

Répondre

0

Merci pour les critiques finalement je résolu le problème pour moi-même, ce fut à cause des espaces ifelse(Tb.PDSI$X2[i]<-1, lorsque le bon WAS ifelse(Tb.PDSI$X2[i]< (-1)