在人口规模随时间变化的数据框上使用dplyr
,我想确定子群体首先超过零的时间点集合,以及相应的先前时间点集合(即子群体超过零之前的最新时间)。我可以找到第一组时间点如下:
df <- data.frame(time = rep(1:4, each = 3),
id = rep(letters[1:3], times = 4),
population = c(1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 0))
first_gens <- group_by_(df, ~id) %>%
filter_(~population > 0) %>%
summarise_(start_time = ~min(time)) %>%
ungroup()
在这个例子中,子群体a,b和c的第一个时间点分别为1,2和3。
我无法弄清楚找到以前时间点的简单方法。在这个例子中,子群体a,b和c的先前时间点应分别为NA,1和2(处理NA情况并不重要,因为我可以过滤掉这种情况)。
编辑:我想要一个适用于任意时间点序列的解决方案。
非常感谢任何帮助。
(注意:我使用“{”形式的dplyr
函数来满足CRAN包的要求。)
答案 0 :(得分:1)
您可以使用lag
df %>%
group_by(id) %>%
summarize(min(time[population > 0]),
lag(time)[min(which(population > 0))])
> df %>%
+ group_by(id) %>%
+ summarize(min(time[population > 0]),
+ lag(time)[min(which(population > 0))])
# A tibble: 3 x 3
id `min(time[which(population > 0)])` `lag(time)[min(which(population > 0))]`
<fct> <int> <int>
1 a 1 NA
2 b 2 1
3 c