3 условного оператора выдает ошибку длины в r - PullRequest
1 голос
/ 08 октября 2019

Мне нужно создать специальные правила для некоторых данных, которые у меня есть (если значение <= 0,1, то пропустить его, это ошибка), но я хочу сделать это только для определенных категорий. </p>

Мои данныевыглядит так

   Category              value
     A                     0.9
     A                     0.001
     A                     0.3
     B                     0.01
     B                     0.8
     C                     0.01
     C                     0.01
     C                     0.2
     C                     NA

Я хочу это

   Category              value
     A                     0.9
     A                     0.001
     A                     0.3
     B                     NA
     B                     0.8
     C                     NA
     C                     NA
     C                     0.2
     C                     NA

Мой код выглядит так:

 want<- Mydata %>% 
           mutate(value2= if_else(!is.na(value) &
                                   value<=0.1 & 
                                   Category=='B' ||
                                   !is.na(value) &
                                   value<=0.1 & 
                                   Category=='C',
                                 as.numeric(NA), value ) )

Но я получаю это сообщение об ошибке:

 Error: `true` must be length 1 (length of `condition`), not 1245

Насколько я понимаю, ||является логическим и & является индивидуумом, поэтому, по сути, я хочу сказать

ЕСЛИ (НЕ NA И <= 15 И в категории B) ИЛИ (НЕ NA И <= 15 И в категории C), то сделать значениеNA еще использует исходное значение. </p>

Я не понимаю, почему я получаю эту ошибку, я неправильно понимаю |против ||и & vs &&?

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Использование case_when

library(dplyr)
d %>%
    mutate(value = case_when(
        value <= 0.1 & Category %in% c("B", "C") ~ NaN,
        TRUE ~ value
    ))
2 голосов
/ 08 октября 2019

Здесь проблема заключается в использовании ||, который возвращает один ИСТИНА / ЛОЖЬ, вместо |. Согласно ?"||"

& и && указывают логическое И и |и ||указать логическое ИЛИ. Более короткая форма выполняет поэлементное сравнение во многом так же, как арифметические операторы. Более длинная форма оценивает слева направо, рассматривая только первый элемент каждого вектора. Оценка продолжается только до определения результата. Более длинная форма подходит для программирования потока управления и обычно предпочтительнее в предложениях if.

library(dplyr)
Mydata %>% 
       mutate(value2= if_else(((!is.na(value)) &
                               (value<=0.1) & 
                               (Category=='B')) |
                               ((!is.na(value)) &
                               (OPD_PTNT_PCNT_out<=0.1) & 
                               (Category=='C')),
                               NA_real_, value ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...