2014-02-18 156 views
0

我想要做的是从三个不同的数据集创建一个单一的白内障变量,询问有关白内障。 (基本上,电话采访,使用简短问卷的浪潮以及使用较长问卷的浪潮)。这些数据集已合并,因此缺少为他们未参与的wave参与者的值创建的值我已经将三个独立的白内障变量中的每一个编码为1 =是和0 =否。在下面的代码中,我想说如果你对三个变量中的任何一个做出回答(1),然后给出1的值,那么如果你是一个没有(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 

关于我在这里失踪的逻辑事物的任何建议?

+3

我认为你需要澄清你的'猫'标准。如果我正确地理解了你,你写出如果x,y,z的_any_为0,那么你想将'cat'设置为零。同时你写道,如果x,y,z的_any_是1,那么你想设置'cat'为1。因此,例如,如果x = 0,y = 1,z = NA,则满足cat = 0和cat = 1的标准。 – Henrik

+0

是的,抱歉,缺乏清晰度。所以,三个单独的变量向不同的人提出相同的问题。因此,最终的数据集被附加在一起。第一次调查的变量,第二次和第三次调查中的人员缺少值。第二次调查的变量将缺少第一次和第三次调查的值,依此类推。当然,所有变量都有NA的可能性也就是说,当一个人没有在他们的浪潮中回答问题时。 – user3314465

回答

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的值返回到所有x,yz都是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 
+0

@ user3314465,因为你是新手,请花些时间阅读[**关于Stackoverflow **](http://stackoverflow.com/about)和[**当某人回答**时该怎么办](http ://stackoverflow.com/help/someone-answers)。 – Henrik

相关问题