簡體   English   中英

如何根據現有變量值的多個條件創建新變量

[英]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 

但我沒有得到它,而是收到以下錯誤:

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 

有人可以幫我解決這個問題嗎?

以下是更改的內容以及原因:

  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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM