我正试图产生观察的"情节",将观察结果组合在一起,它们</=
相隔14天发生.有了dplyr,我设法计算了自上次观察以来的天数.但是,我无法弄清楚如何在</= 14
没有for
循环的情况下基于条件获取新的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
Run Code Online (Sandbox Code Playgroud)
预期产量:
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
Run Code Online (Sandbox Code Playgroud)
我尝试过使用滞后
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
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.我不明白为什么ith
第4行是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
Run Code Online (Sandbox Code Playgroud)