мутировать с несколькими условиями, используя if_else или ifelse - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать новую переменную lab_conf на основе соответствия любому условию для 2 других переменных diagnosis и PC_R.Вот код, который я использую:

mutate(lab_conf = ifelse( (diagnosis == "confirmed")|(PC_R == "pos"), "pos", "neg"))

Вывод, который я получаю, показывает NA, где он должен показывать «neg», поэтому я получаю только 2 значения;«pos» или «NA».Я хотел бы, чтобы значения для этой новой переменной были либо "pos", "neg", либо NA на основе указанных условий, где NA было бы, если это NA в обоих условиях.

Вот чтоЯ получаю с dput(head(x)):

structure(list(diagnosis = structure(c(16L, 16L, 16L, 3L, 16L, 
3L), .Label = c("*un-confirmed", "Cloted sample", "confirmed", 
"Hemolysed sampl", "inadequate sample", "rej (sample leaking)", 
"rej(Hemolyzed sample)", "rej(Hemolyzed)", "rej: sample Hemolyzed", 
"rej: sample leaking", "rej: sample leaking + Hemolyzed", "rej: sample leaking+not convnient tube", 
"repeat sample", "tf", "TF", "un-confirmed"), class = "factor"), 
    PC_R = structure(c(NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_), .Label = c("clotted", 
    "hemolyzed", "neg", "not pos", "Not REQUIred", "OTHER", "pos", 
    "QNS", "rej", "repeat sample", "Sample broken", "tf", "TF"
    ), class = "factor"), lab_conf = c(NA, NA, NA, "pos", NA, 
    "pos")), .Names = c("diagnosis", "PC_R", "lab_conf"), row.names = c(NA, 
6L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Используйте %in% вместо ==, например так:

df = df %>%
  mutate(lab_conf = ifelse( (diagnosis %in% "confirmed") | (PC_R %in% "pos"), "pos", "neg"))

Проблема, с которой вы сталкиваетесь, заключается в том, что оператор == возвращает NA, если один из операндов равен NA.Также, NA | FALSE возвращает NA.Эти два факта объясняют, почему ваш оператор OR оценивается как NA, что приводит к тому, что ваш ifelse оценивается как NA.

Оператор ifelse устанавливается так, чтобы он возвращал "pos", если инструкция оценивается как TRUE, и "neg", если инструкция оценивается как FALSE, но ifelse ничего не возвращает, если инструкция оценивается как NA.Вот почему вы получаете АН.

Использование %in% обходит это.

0 голосов
/ 14 февраля 2019

Обычно, когда вы предоставляете образцы данных, вы хотите предоставить все возможные результаты.Все предоставленные вами примеры данных.

Я создал для вас некоторые примеры данных, которые, я думаю, - то, к чему вы стремитесь, а затем, как это сделать.

 library(dplyr)
temp2 <- structure(list(diagnosis = c("unconfirmed", "unconfirmed", "unconfirmed", "confirmed", "confirmed", "confirmed"), PC_R = c("pos", "neg",NA, "pos", "neg", NA)), row.names = c(NA, -6L), class = "data.frame")

temp2 %>% mutate(lab_conf = ifelse(diagnosis == "confirmed" | PC_R == "pos", "pos", "neg"))

   diagnosis PC_R lab_conf
1 unconfirmed  pos      pos
2 unconfirmed  neg      neg
3 unconfirmed <NA>     <NA>
4   confirmed  pos      pos
5   confirmed  neg      pos
6   confirmed <NA>      pos
...