这可能是一个非常基本的问题。但我无法找出解决方案。所以,我有3个变量叫做x
,y
和z
。
x<-c(0,0,1,1)
y<-c(21,0,3,NA)
z<-c(10,15,NA,12)
d<-data.frame(x,y,z)
现在我想创建一个变量,如果满足以下三个条件中的任何一个,则取值为1
:x>1
或y>=8
或z<=8
。否则我希望它是0
,只有当所有变量都缺少值时我才想要NA
。以下代码
d$a <- ifelse(d$x>1 | d$y>=8 | d$z<=8, 1,
ifelse(is.na(d$x)==T & is.na(d$y)==T & is.na(d$z)==T, NA, 0))
给我吗:
> d
x y z a
1 0 21 10 1
2 0 0 15 0
3 1 3 NA NA
4 1 NA 12 NA
但我的预期产量是1, 0, 0, 0
为a
。那么我应该如何正确编码呢?
pmax
是你的朋友:
pmax(d$x > 1, d$y >= 8, d$z <= 8, na.rm=TRUE)
#[1] 1 0 0 0
在检查实际列值之前,应检查NOT NA。一个选项可以是使用as
d$a <- ifelse(is.na(x) & is.na(y) & is.na(z), NA,
ifelse( (!is.na(x) & d$x>1) | (!is.na(y) & d$y>=8) |
(!is.na(z) & d$z<=8), 1, 0))
d
# x y z a
#1 0 21 10 1
#2 0 0 15 0
#3 1 3 NA 0
#4 1 NA 12 0
解决方案:不要使用ifelse
。
d$a <- 0
d$a[d$x>1 | d$y>=8 | d$z<=8] <- 1 ## subscript assigns only work for TRUE
d$a[is.na(d$x)==T & is.na(d$y)==T & is.na(d$z)==T] <- NA