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