R中IF语句的输出不正确

R中IF语句的输出不正确,r,if-statement,data.table,return-value,R,If Statement,Data.table,Return Value,我正在用自己构建的一个简单脚本计算PDSI,但是当我运行脚本时,我在DT的输出中得到了一个不同的值。我在和一张纸以及excel中手动进行了所有计算,并对两者进行了验证,得到了正确的值 这里是脚本的摘录,我没有任何错误,所以我不知道我的错误在哪里 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

我正在用自己构建的一个简单脚本计算PDSI,但是当我运行脚本时,我在DT的输出中得到了一个不同的值。我在和一张纸以及excel中手动进行了所有计算,并对两者进行了验证,得到了正确的值

这里是脚本的摘录,我没有任何错误,所以我不知道我的错误在哪里

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])
   }
  }
}
这是我在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
给了我那些不正确的值。

感谢批评者,最后我自己解决了这个问题,这是因为空格
ifelse(Tb.PDSI$X2[I]你应该做一个简单的例子。我怀疑你需要完整的脚本或这么多的专栏来说明这个问题。请看,你没有给我们任何理由认为你在Excel中的编码应该是一个“金标准”。您显然在两个不同的平台上做了一些不同的事情,我们无法确定哪一个是正确的(因为您没有用自然语言解释算法可能是什么,我们也没有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