【问题标题】:How to create new variables based on multiple conditions on existing variable values如何基于现有变量值的多个条件创建新变量
【发布时间】:2021-09-28 08:12:22
【问题描述】:

我有一个包含 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 

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

if ((P3[i] == 3 || P3[i] == 6 || P3[i] == 8 || P3[i] == 11 || 中的错误: 需要 TRUE/FALSE 的缺失值

我知道我在使用 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 

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

【问题讨论】:

    标签: r dataframe if-statement na


    【解决方案1】:

    以下是更改的内容和原因:

    1. 在 X2 和 X5 条件下,我在实际检查 P2 之前添加了!is.na(P2[i]) &amp;&amp; ,以首先确保我们没有处理NA。如果这条语句的结果为 false,那么我们确定应该执行 else 语句。
    2. 在 X3 和 X4 中,您使用的是 X3&lt;-1 而不是 X3[i]&lt;-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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多