如何根据现有变量值的多个条件创建新变量
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
有人可以帮我解决这个问题吗?
更改内容及原因如下:
- 在 X2 和 X5 条件下,我在实际检查 P2 之前添加了
!is.na(P2[i]) &&
,以首先确保我们没有处理 NA
。如果此语句结果为 false,那么我们确定应该执行 else 语句。
- 在 X3 和 X4 中你有
X3<-1
而不是 X3[i]<-1
- 在 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)
我有一个包含 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
有人可以帮我解决这个问题吗?
更改内容及原因如下:
- 在 X2 和 X5 条件下,我在实际检查 P2 之前添加了
!is.na(P2[i]) &&
,以首先确保我们没有处理NA
。如果此语句结果为 false,那么我们确定应该执行 else 语句。 - 在 X3 和 X4 中你有
X3<-1
而不是X3[i]<-1
- 在 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)