使用dplyr查找具有指定条件*和*一组相关行的行

时间:2018-02-08 11:24:14

标签: r dplyr

在人口规模随时间变化的数据框上使用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包的要求。)

1 个答案:

答案 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