[英]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
有人可以幫我解決這個問題嗎?
以下是更改的內容以及原因:
!is.na(P2[i]) &&
以首先確保我們沒有處理NA
。 如果此語句的結果為 false,則我們確定應執行 else 語句。X3<-1
而不是X3[i]<-1
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.