ifelse для всей группы (не только один ряд) - PullRequest
0 голосов
/ 15 апреля 2020

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

id = rep(c(1:3), each = 5)
date = rep(seq.Date(as_date("2010-01-01"), as_date("2010-01-05"), by = "day"), 3)
value = c(1:4, NA, 3:5, NA, 5, NA, 1:4)

df <- data.frame(id, date, value)

Предположим, я хочу создать столбец «отсутствует», который принимает значение 1 для всей группы (а не только для соответствующей строки), если столбец «значение» равен NA для даты = 2010-01- 05.

df %>% group_by(id) %>% mutate(missing = ifelse(value %in% NA & date == "2010-01-05", 1, 0))

Я пытался передать group_by(id) перед командой ifelse, как описано выше, надеясь, что значение ifelse будет заполнено группой, но это не работает. На самом деле он выдает тот же результат, что и в приведенном ниже коде, который не имеет group_by pipe.

df %>% mutate(missing = ifelse(value %in% NA & date == "2010-01-05", 1, 0))

В конце дня я хочу, чтобы мои данные выглядели как

df2
   id       date value missing
1   1 2010-01-01     1       1
2   1 2010-01-02     2       1
3   1 2010-01-03     3       1
4   1 2010-01-04     4       1
5   1 2010-01-05    NA       1
6   2 2010-01-01     3       0
7   2 2010-01-02     4       0
8   2 2010-01-03     5       0
9   2 2010-01-04    NA       0
10  2 2010-01-05     5       0
11  3 2010-01-01    NA       0
12  3 2010-01-02     1       0
13  3 2010-01-03     2       0
14  3 2010-01-04     3       0
15  3 2010-01-05     4       0

Есть ли способ, которым я могу сделать это, каким-то образом настроив ifelse?

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете сделать,

library(dplyr)

df %>% 
 group_by(id) %>% 
 mutate(res = as.integer(is.na(value[date == "2010-01-05"])))

, что дает,

id date       value   res
   <int> <date>     <dbl> <int>
 1     1 2010-01-01     1     1
 2     1 2010-01-02     2     1
 3     1 2010-01-03     3     1
 4     1 2010-01-04     4     1
 5     1 2010-01-05    NA     1
 6     2 2010-01-01     3     0
 7     2 2010-01-02     4     0
 8     2 2010-01-03     5     0
 9     2 2010-01-04    NA     0
10     2 2010-01-05     5     0
11     3 2010-01-01    NA     0
12     3 2010-01-02     1     0
13     3 2010-01-03     2     0
14     3 2010-01-04     3     0
15     3 2010-01-05     4     0
...