2014-02-18 4 views
0

То, что я пытаюсь сделать, - создать единую переменную катаракты из трех разных наборов данных, которые задают вопрос о катаракте. (В основном, телефонное интервью, волна с использованием короткой анкеты и волна с использованием более длинного вопросника.) Эти наборы данных были объединены, так что отсутствуют значения, созданные для значений для участников волны, в которой они не участвовали Я закодировал каждый из трех отдельных пучков катаракты как 1 = ДА и 0 = НЕТ.Как объединить значения из трех переменных в одну переменную?

В следующем коде я пытаюсь сказать, если вы ответите yes (1) на любой из трех vars, тогда укажите значение 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 

Любые предложения о том, какую логическую вещь мне здесь не хватает?

+3

Думаю, вам нужно уточнить критерии для «кошки». Если я правильно вас понимаю, вы пишете, что если _any_ из x, y, z равно 0, вы хотите установить «cat» в ноль. В то же время вы пишете, что если _any_ из x, y, z равно 1, вы хотите установить «cat» в единицу. Так, если, например, x = 0, y = 1, z = NA, то критерии для cat = 0 _ и_ cat = 1 выполняются. – Henrik

+0

Да, извините за отсутствие ясности. Таким образом, три отдельные переменные задают одни и те же вопросы различным людям. Поэтому окончательный набор данных прилагается вместе.Переменная для первого обследования будет иметь недостающие значения для людей, представленных во втором и третьем опросах. Переменная для второго обследования будет иметь отсутствующие значения для первого и третьего опросов и т. Д. Конечно, есть вероятность, что все переменные будут иметь NA, и именно тогда человек не ответил на вопрос в своей волне. – user3314465

ответ

0

Это немного хака, но должно дать вам правильный результат:

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, y и z - 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, потому что вы новичок в SO, пожалуйста, уделите время, чтобы прочитать [** о Stackoverflow **] (http://stackoverflow.com/about) и [**, что делать, когда кто-то отвечает **] (http : //stackoverflow.com/help/someone-answers). – Henrik

Смежные вопросы