ifelse () и, если еще задано другое, приводят к dplyr mutate () для переменной времени - PullRequest
0 голосов
/ 15 ноября 2018

Давайте предположим, что data.frame выглядит следующим образом:

df <- read.table(text = "ID Date Condition
                1 2015/01/01  Yes
                1 2015/01/10  No        
                1 2015/01/15  Yes
                2 2015/02/10  No                                   
                2 2015/03/08  No
                3 2015/01/01  No                                     
                3 2015/04/01  Yes
                3 2015/04/10  No
                3 2015/04/01  Yes
                3 2015/04/10  No", header = TRUE)

Я хочу вычислить количество дней между данной датой и первой датой для каждого идентификатора отдельно.Теперь для каждого идентификатора, где условие всегда «Нет», я хочу назначить NA в столбце с результатами.

Это мой код:

df %>%
  mutate(Date = as.Date(Date, "%Y/%m/%d")) %>%
  group_by(ID) %>%
  mutate(Temp = Date - first(Date),
         Res1 = ifelse(all(Condition == "No"), NA, Temp),
         Res2 = if(all(Condition == "No")) NA else Temp)

Результаты:

      ID Date       Condition Temp    Res1 Res2  
   <int> <date>     <fct>     <time> <dbl> <time>
 1     1 2015-01-01 Yes       0         0. 0     
 2     1 2015-01-10 No        9         0. 9     
 3     1 2015-01-15 Yes       14        0. 14    
 4     2 2015-02-10 No        0        NA  <NA>  
 5     2 2015-03-08 No        26       NA  <NA>  
 6     3 2015-01-01 No        0         0. 0     
 7     3 2015-04-01 Yes       90        0. 90    
 8     3 2015-04-10 No        99        0. 99    
 9     3 2015-04-01 Yes       90        0. 90    
10     3 2015-04-10 No        99        0. 99 

Мой вопрос: в чем причина того, что ifelse () дает неверные результаты, а если еще дает желаемые результаты?

1 Ответ

0 голосов
/ 15 ноября 2018

Видимо, вы не понимаете ifelse.Это принципиально отличается от if и else.В документации ясно сказано, что «ifelse возвращает значение той же формы, что и test», которое является вектором длины один в вашем примере.mutate затем повторяет это.

Вот простой пример:

all(c(TRUE, TRUE))
#[1] TRUE
ifelse(all(c(TRUE, TRUE)), 1:2, 3:4) #test is vector of length 1
#[1] 1
ifelse(c(TRUE, FALSE), 1:2, 3:4) #test is vector of length 2
#[1] 1 4

Я бы посоветовал вам изучить исходный код функции ifelse, которая должна сделать это очевиднымпочему он так себя ведет.

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