Если условие --- пропущено значение, где требуется ИСТИНА / ЛОЖЬ - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь выполнить условия «если» и «еще, если», чтобы создать новую переменную на основе значений двух существующих переменных. Вот пример выходных данных двух существующих переменных, для которых я пишу свое условие.

Вот dput для воспроизведения двух переменных:

structure(list(C = c(NA, NA, "Standard", "Standard", NA, "Micro", 
NA, NA, NA, NA, "Nursery", "Standard", NA, "Micro", "Micro", 
NA, NA, NA, "Standard", "Standard"), P = c(NA, NA, "Standard", 
"Standard", NA, NA, NA, NA, NA, NA, NA, "Standard", "Standard", 
"Micro", NA, NA, NA, NA, NA, "Standard")), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

, а вот if и else ifоператор, который я использую:

if (DF$C=="Standard" | DF$P=="Standard") {
  mutate("Type" = "Standard")
} else if (DF$C=="Micro" | DF$P=="Micro") {
  mutate("Type" = "Micro")
} else if (DF$C=="Nursery" | DF$P=="Nursery") {
  mutate("Type" = "Nursery")
  } else {
    mutate("Type" = "Other")
  }

Мне нужна новая переменная с именем "Тип" со значениями "Стандарт", "Микро", "Питомник" или "Другое", но я получаю эту ошибкувместо сообщения:

Error in if (Site.Details.TEST$C == "Standard" | Site.Details.TEST$P ==  : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In if (Site.Details.TEST$C == "Standard" | Site.Details.TEST$P ==  :
  the condition has length > 1 and only the first element will be used

Ответы [ 3 ]

0 голосов
/ 12 октября 2019

Это почти то же самое, что и предыдущий ответ:

> df %>% mutate(Type=case_when(C==P ~ C, 
          is.na(C) & is.na(P) ~ "Other", !is.na(C) ~ C, !is.na(P) ~ P))
# A tibble: 20 x 3
   C        P        Type    
   <chr>    <chr>    <chr>   
 1 NA       NA       Other   
 2 NA       NA       Other   
 3 Standard Standard Standard
 4 Standard Standard Standard
 5 NA       NA       Other   
 6 Micro    NA       Micro   
 7 NA       NA       Other   
 8 NA       NA       Other   
 9 NA       NA       Other   
10 NA       NA       Other   
11 Nursery  NA       Nursery 
12 Standard Standard Standard
13 NA       Standard Standard      
14 Micro    Micro    Micro   
15 Micro    NA       Micro   
16 NA       NA       Other   
17 NA       NA       Other   
18 NA       NA       Other   
19 Standard NA       Standard
20 Standard Standard Standard
0 голосов
/ 12 октября 2019

Это можно сделать с помощью ifelse в стандартном R, поскольку вы просто хотите заполнить поле Тип, когда оба поля P и C совпадают и не являются NA.

DF$Type <- ifelse( (is.na(DF$P) | is.na(DF$C)) | (DF$P != DF$C), 'Other', DF$C)
0 голосов
/ 12 октября 2019

Возможно, что-то векторизованное в dplyr поможет. По сути, вы смотрите, встречается ли одно из трех совпадений («Стандарт», «Микро» или «Питомник») в любом поле C или P. Если это выполнено, возьмите это совпавшее значение. Если ни один из столбцов не совпадает, введите код «Другое».

Это работает при условии, что C и P не могут быть разными вещами. Если это так, предпочтение отдается C.

library(dplyr)

check_types <- c("Standard", "Micro", "Nursery")

DF %>%
  mutate(Type = if_else(C %in% check_types | P %in% check_types, if_else(is.na(C), P, C), "Other"))

   C        P        Type    
   <chr>    <chr>    <chr>   
 1 NA       NA       Other   
 2 NA       NA       Other   
 3 Standard Standard Standard
 4 Standard Standard Standard
 5 NA       NA       Other 

. Оператор if_else(condition, true, false) ищет векторизованное условие, а затем либо одно значение для true и false, либо векторноезначение той же длины, что и условие. В этом случае:

условие:

C %in% check_types | P %in% check_types

Это вектор, равный по длине количеству строк во фрейме данных. Каждая позиция в векторе основана на оценке dplyr в соответствующей строке.

Значение будет TRUE, если C является одним из параметров в check_types или если P - одиниз опций в check_types. В противном случае это будет FALSE

true:

if_else(is.na(C), P, C)

Если оператор оценивается как TRUE, то теперь проверьте, какое значение принять. Если (опять же, в данном заданном векторном месте или строке) C равно NA, тогда возьмите P. В противном случае примите C.

false:

"Other"

Если оператор оценивается как FALSE, тогда принимайте значение равным «Другое».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...