r-ifelse用于整个组(而不仅仅是一行)



我正在尝试将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)

假设我想创建一个"missing"列,如果"value"列是NA,则该列的值为整个组(而不仅仅是对应的行(的值1(日期=2010-01-05(。

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

我尝试在ifelse命令之前管道化group_by(id),就像上面一样,希望ifelse值将由组填充,但它不起作用。事实上,它产生的结果与下面没有group_by管道的代码相同。

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来做到这一点?

你可以做,

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

最新更新