2014-02-18 154 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

相關問題