如何将三个变量的值组合成一个变量?

时间:2014-02-18 21:18:53

标签: r if-statement

我要做的是从三个不同的数据集中创建一个关于白内障的白内障变量。 (基本上,电话采访,使用简短调查问卷的浪潮,以及使用较长调查问卷的浪潮。)这些数据集已合并,因此为他们未参与的wave中参与者的值创建了缺失值。我已将三个独立的白内障变量中的每一个编码为1 = YES和0 = NO。

在下面的代码中,我试图说你是否对三个vars中的任何一个回答yes(1),然后给出值1,那么如果你是No(0),那么给出一个值0,否则为“NA”。

survey$cataract<-ifelse(survey$ew3_cat==1 | survey$lq3_catnum==1 | survey$sq3_cat==1,1,
                        ifelse(survey$ew3_cat==0 | survey$lq3_catnum==0 | survey$sq3_cat==0,0,NA))

从下面的结果可以看出,我得到的是1,但其他一切都是“NA”,没有零。

> table(survey$cataract,useNA="ifany")

    1  <NA> 
10303 63322 

现在,如果我更改顺序,请先说出所有的零,然后我得到正确的0,但没有1。

survey$cataract<-ifelse(survey$ew3_cat==0 | survey$lq3_catnum==0 | survey$sq3_cat==0,0,
                        ifelse(survey$ew3_cat==1 | survey$lq3_catnum==1 | survey$sq3_cat==1,1,NA))

> table(survey$cataract,useNA="ifany")

    0  <NA> 
63315 10310 

来自三个独立变量的正确计数应为:

10,303 = 1
63,315 = 0
7= NA

我也尝试用如下的补充数据复制这个问题:

x <- c(rep(1,100),rep(0,200),rep(NA,400))
y <- c(rep(NA,300),rep(1,100),rep(0,100),rep(NA,200))
z <- c(rep(NA,500),rep(1,100),rep(0,100))

cat <- ifelse(x==1|y==1|z==1,1,
         ifelse(x==0|y==0|z==0,0,NA))
> table(cat,useNA="ifany")
cat
   1 <NA> 
 300  400 

如果我颠倒顺序,同样的问题:

cat <- ifelse(x==0|y==0|z==0,0,
         ifelse(x==1|y==1|z==1,1,NA))
> table(cat,useNA="ifany")
cat
   0 <NA> 
 400  300

关于我在这里缺少什么逻辑的建议?

1 个答案:

答案 0 :(得分:0)

这有点hackish但应该给你正确的结果:

tmp <- as.numeric(mapply(any, as.logical(x),as.logical(y),as.logical(z), na.rm=TRUE))
tmp[which(mapply(all, is.na(x), is.na(y), is.na(z)))] <- NA

基本上它会查找任何值1,对这些值返回1,否则返回0。然后它返回并将NA值重新放回xyz NA的所有位置。

> table(tmp)
tmp
  0   1 
400 300

注意:您的示例数据似乎不太适合测试,因为您的案例是NA-NA-NA

> ftable(x,y,z, useNA='always')
      z   0   1  NA
x  y               
0  0      0   0   0
   1      0   0   0
   NA     0   0 200
1  0      0   0   0
   1      0   0   0
   NA     0   0 100
NA 0      0   0 100
   1      0   0 100
   NA   100 100   0

所以,这里有一个稍微修改过的数据版本,显示上面的代码正常工作:

x <- c(rep(1,100),rep(0,200),rep(NA,400))
y <- c(rep(NA,300),rep(1,100),rep(0,100),rep(NA,200))
z <- c(rep(NA,500),rep(1,100),rep(0,50),rep(NA,50))

这些数据的结果:

> ftable(x,y,z, useNA='always')
      z   0   1  NA
x  y               
0  0      0   0   0
   1      0   0   0
   NA     0   0 200
1  0      0   0   0
   1      0   0   0
   NA     0   0 100
NA 0      0   0 100
   1      0   0 100
   NA    50 100  50

> table(tmp, useNA='always')
tmp
   0    1 <NA> 
 350  300   50