Условный оператор для получения разных результатов поэлементно, когда NA является полным или частичным - PullRequest
0 голосов
/ 08 мая 2020

У меня есть этот набор данных с 6 переменными, содержащими положительные, отрицательные или NA. Необходимо создать новый столбец на основе значений этих переменных следующим образом:

P, если ЛЮБАЯ из 6 переменных содержит положительный результат.

N если НИ ОДНА из 6 переменных не содержит положительного результата.

NA, если ВСЕ из 6 переменных имеют NA.

MWE

var1 <- c('var1P', 'var1N', 'var1P', 'var1P', NA, 'var1N')
var2 <- c('var2N', 'var2N', 'var2N', 'var2P', NA, 'var2N')
var3 <- c('var3N', 'var3N', 'var3N', 'var3P', NA, 'var3N')
var4 <- c('var4P', 'var4N', 'var4P', 'var4P', NA, 'var4N')
var5 <- c(NA, 'var5N', 'var5N', 'var5P', NA, 'var5N')
var6 <- c(NA, NA, 'var6N', 'var6P', NA, 'var6N')
No <- seq(1:6)

df <- data.frame(No, var1, var2, var3, var4, var5, var6)

Код

dfnew <- df %>%
  dplyr::mutate(varif = ifelse(var1 == 'var1P' | var2 == 'var2P' | var3 == 'var3P' | var4 == 'var4P' | var5 == 'var5P' | var6 == 'var6P', 'P', 'N'))

Вывод

  No  var1  var2  var3  var4  var5  var6 varif
   1 var1P var2N var3N var4P  <NA> <NA>      P
   2 var1N var2N var3N var4N var5N  <NA>   <NA>
   3 var1P var2N var3N var4P var5N var6N     P
   4 var1P var2P var3P var4P var5P var6P     P
   5  <NA> <NA> <NA> <NA> <NA> <NA>        <NA>
   6 var1N var2N var3N var4N var5N var6N     N

Вопрос

varif для номера 2 следует читать N вместо NA, чтобы отличить его от номера 5, где все значения были NA.

Failed Trial

impMe <- function (var1, var2, var3, var4, var5, var6) {
  x <-ifelse(is.na(var1) & is.na(var2) & is.na(var3) & is.na(var4) & is.na(var5) & is.na(var6), NA,
             ifelse (var1 == 'var1P' | var2 == 'var2P' | var3 == 'var3P' | var4 == 'var4P' | var5 == 'var5P' | var6 == 'var6P','P','N'))
  return(x)
}

dfnew <- df %>%
  dplyr::mutate(varif = impMe(var1, var2, var3, var4, var5, var6))

  No  var1  var2  var3  var4  var5  var6 varif
   1 var1P var2N var3N var4P  <NA> <NA>      P
   2 var1N var2N var3N var4N var5N  <NA>   <NA>
   3 var1P var2N var3N var4P var5N var6N     P
   4 var1P var2P var3P var4P var5P var6P     P
   5  <NA> <NA>   <NA> <NA>   <NA> <NA>    <NA>
   6 var1N var2N var3N var4N var5N var6N     N

1 Ответ

0 голосов
/ 08 мая 2020

в tidyverse есть драгоценный камень с именем case_when(), он выполняет многозадачный ifelse (). Я закомментировал строку для NA, потому что она не нужна, так как case_when() вернет NA, если все упомянутые условия не были выполнены, что делает эту строку ненужной!

dfnew <- df %>%
  dplyr::mutate(varif = case_when (
                  ## is.na(var1) & is.na(var2) & is.na(var3) & is.na(var4) & is.na(var5) & is.na(var6) ~ NA,
                  var1 == 'var1P' | var2 == 'var2P' | var3 == 'var3P' | var4 == 'var4P' | var5 == 'var5P' | var6 == 'var6P' ~ 'P',
                  !is.na(var1) | !is.na(var2) | !is.na(var3) | !is.na(var4) | !is.na(var5) | !is.na(var6) ~ 'N'
                  ))

Вывод

enter image description here

...