如何根据现有变量值的多个条件创建新变量

How to create new variables based on multiple conditions on existing variable values

我有一个包含 3 个变量的数据框:

 P1 P2 P3 
  2 12  8 
  2  1  6 
  2  7  8 
 NA NA  2 
  1 NA  6 
 NA  8 11 

我需要根据以下条件计算另外5个新变量的值:

P1<-c(2,2,2,NA,1,NA)
P2<-c(12,1,7,NA,NA,8)
P3<-c(8,6,8,2,6,11)

df<-data.frame(P1,P2,P3)
attach(df)

X1<-X2<-X3<-X4<-X5<-c()

for(i in 1:(dim(df)[1])){
  #X1
  if((P3[i]==1||P3[i]==2||P3[i]==4||P3[i]==5||P3[i]==7||P3[i]==13) || ((P3[i]==3||P3[i]==6||P3[i]==8||P3[i]==12)&&(P1[i]==1))){X1[i]<-1
  }else{X1[i]<-0}
  
  #X2
  if((P3[i]==3||P3[i]==6||P3[i]==8||P3[i]==11||P3[i]==12)&&
     (P2[i]==1||P2[i]==2||P2[i]==3||P2[i]==5||P2[i]==6||P2[i]==7||P2[i]==10||P2[i]==11)){X2[i]<-1
  }else{X2[i]<-0}
  
  #X3
  if(P3[i]==1||P3[i]==2||P3[i]==4||P3[i]==5||P3[i]==7||P3[i]==13){X3<-1
  }else{X3[i]<-0}
  
  #X4
  if((P3[i]==3||P3[i]==6||P3[i]==8||P3[i]==12)&&(P1[i]==1)){X4<-1
  }else{X4[i]<-0}
  
  #X5
  if((P3[i]==6||P3[i]==8||P3[i]==11) && (P2[i]=12||P2[i]==8)){X5[i]<-1
  }else{X5[i]<-0}
}
df<-cbind(df,X1,X2,X3,X4,X5) 

这是我想要的结果:

 P1 P2 P3 X1 X2 X3 X4 X5 
  2 12  8  0  0  0  0  1 
  2  1  6  0  1  0  0  0 
  2  7  8  0  1  0  0  0 
 NA NA  2  1  0  1  0  0 
  1 NA  6  1  0  0  1  0 
 NA  8 11  0  0  0  0  1 

但我没有得到它,而是收到以下错误:

Error in if ((P3[i] == 3 || P3[i] == 6 || P3[i] == 8 || P3[i] == 11 || : missing value where TRUE/FALSE needed

我知道我对 NA 有问题,因为当我用 NA 删除观察时,我没有得到那个错误,但是尽管我尝试了不同的方法,但我找不到任何方法来修复它。

另一方面,当我 运行 没有 NA 的行时,结果有错误。

P1<-c( 2,2,2)
P2<-c(12,1,7)  #rows without NA
P3<-c( 8,6,8)
 P1 P2 P3 X1 X2 X3 X4 X5
  2 12  8  0  0  0  0  1
  2  1  6  0  1  0  0  1
  2  7  8  0  1  0  0  1

我得到了上面的结果,而我应该得到这个:

 P1 P2 P3 X1 X2 X3 X4 X5 
  2 12  8  0  0  0  0  1 
  2  1  6  0  1  0  0  0 
  2  7  8  0  1  0  0  0 

有人可以帮我解决这个问题吗?

更改内容及原因如下:

  1. 在 X2 和 X5 条件下,我在实际检查 P2 之前添加了 !is.na(P2[i]) && ,以首先确保我们没有处理 NA。如果此语句结果为 false,那么我们确定应该执行 else 语句。
  2. 在 X3 和 X4 中你有 X3<-1 而不是 X3[i]<-1
  3. 在 X5 条件下有 P2[i]=12||P2[i]==8 - 首先是单等号,然后是双等号。单个等号用于赋值,因此它产生 TRUE 值并导致您在问题的第二部分中描述的问题。

这是工作代码:

P1<-c(2, 2,2,NA,1,NA)
P2<-c(12,1,7,NA,NA,8)
P3<-c(8, 6,8, 2,6,11)

df<-data.frame(P1,P2,P3)
attach(df)

X1<-X2<-X3<-X4<-X5<-c()

for(i in 1:(dim(df)[1])){
  #X1
  if((P3[i]==1 || P3[i]==2 || P3[i]==4 || P3[i]==5 || P3[i]==7 || P3[i]==13) || ((P3[i]==3 || P3[i]==6 || P3[i]==8 || P3[i]==12) && (P1[i]==1))){
    X1[i]<-1
  }else{
    X1[i]<-0
  }
  #X2
  if((P3[i]==3 || P3[i]==6 || P3[i]==8 || P3[i]==11 || P3[i]==12) && (!is.na(P2[i]) && (P2[i]==1 || P2[i]==2 || P2[i]==3 || P2[i]==5 || P2[i]==6 || P2[i]==7 || P2[i]==10 || P2[i]==11))){
    X2[i]<-1
  }else{
    X2[i]<-0
  }
  #X3
  if(P3[i]==1 || P3[i]==2 || P3[i]==4 || P3[i]==5 || P3[i]==7 || P3[i]==13){
    X3[i]<-1
  }else{
    X3[i]<-0
  }
  #X4
  if((P3[i]==3 || P3[i]==6 || P3[i]==8 || P3[i]==12)&&(P1[i]==1)){
    X4[i]<-1
  }else{
    X4[i]<-0
  }
  #X5
  if((P3[i]==6 || P3[i]==8 || P3[i]==11) && (!is.na(P2[i]) && (P2[i] == 12 || P2[i] == 8))){
    X5[i]<-1
  }else{
    X5[i]<-0
  }
}
df<-cbind(df,X1,X2,X3,X4,X5) 
show(df)