分组数据上的条件 seq_along
Something like conditional seq_along on grouped data
我正在尝试生成 'episodes' 观察结果,将观察结果分组在一起 </=
相隔 14 天的观察结果。
使用 dplyr 我已经设法计算出自上次观察以来的天数。但是,我无法弄清楚如何在没有 for
循环的情况下根据条件 </= 14
获取新 ID。
示例数据:
#obsvn is number of days since first observation in group
dat <- data.frame(id = c(rep("A",5), rep("B", 2)),
obsvn = c(1, 2, 29, 30, 45, 1, 15))
id obsvn
1 A 1
2 A 2
3 A 29
4 A 30
5 A 45
6 B 1
7 B 15
预期输出:
id obsvn ith
1 A 1 1
2 A 2 1
3 A 29 2
4 A 30 2
5 A 45 3
6 B 1 1
7 B 15 2
我试过使用延迟
dat <- dat %>%
group_by(id) %>%
mutate(ith = 1,
ith = ifelse(obsvn - lag(obsvn) <= 14, lag(ith), lag(ith)+1))
dat
Source: local data frame [7 x 3]
Groups: id
id obsvn ith
1 A 1 NA
2 A 2 1
3 A 29 2
4 A 30 1
5 A 45 2
6 B 1 NA
7 B 15 1
这不是我想要的。我不明白为什么第 4 行的 ith
是 1 而不是 2。
因为它返回 lag(ith)
,它始终为 1(或开头为 NA)。
我会使用 diff
和 cumsum
:
dat %>% group_by(id) %>% mutate(ith = cumsum(c(1,diff(obsvn)>=14)))
Source: local data frame [7 x 3]
Groups: id
id obsvn ith
1 A 1 1
2 A 2 1
3 A 29 2
4 A 30 2
5 A 45 3
6 B 1 1
7 B 15 2
我正在尝试生成 'episodes' 观察结果,将观察结果分组在一起 </=
相隔 14 天的观察结果。
使用 dplyr 我已经设法计算出自上次观察以来的天数。但是,我无法弄清楚如何在没有 for
循环的情况下根据条件 </= 14
获取新 ID。
示例数据:
#obsvn is number of days since first observation in group
dat <- data.frame(id = c(rep("A",5), rep("B", 2)),
obsvn = c(1, 2, 29, 30, 45, 1, 15))
id obsvn
1 A 1
2 A 2
3 A 29
4 A 30
5 A 45
6 B 1
7 B 15
预期输出:
id obsvn ith
1 A 1 1
2 A 2 1
3 A 29 2
4 A 30 2
5 A 45 3
6 B 1 1
7 B 15 2
我试过使用延迟
dat <- dat %>%
group_by(id) %>%
mutate(ith = 1,
ith = ifelse(obsvn - lag(obsvn) <= 14, lag(ith), lag(ith)+1))
dat
Source: local data frame [7 x 3]
Groups: id
id obsvn ith
1 A 1 NA
2 A 2 1
3 A 29 2
4 A 30 1
5 A 45 2
6 B 1 NA
7 B 15 1
这不是我想要的。我不明白为什么第 4 行的 ith
是 1 而不是 2。
因为它返回 lag(ith)
,它始终为 1(或开头为 NA)。
我会使用 diff
和 cumsum
:
dat %>% group_by(id) %>% mutate(ith = cumsum(c(1,diff(obsvn)>=14)))
Source: local data frame [7 x 3]
Groups: id
id obsvn ith
1 A 1 1
2 A 2 1
3 A 29 2
4 A 30 2
5 A 45 3
6 B 1 1
7 B 15 2