使用dplyr查找具有指定条件的行*和*一组相关行
在人口规模随时间变化的数据框架上使用使用dplyr查找具有指定条件的行*和*一组相关行,r,dplyr,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 <- grou
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()
df 0)%>%
总结(开始时间=~min(时间))%>%
解组()
在该示例中,子种群a、b和c的第一时间点分别为1、2和3
我搞不懂的是找到以前时间点的简单方法。在本例中,子种群a、b和c的先前时间点应分别为NA、1和2(处理NA案例并不重要,因为我可以过滤掉此类案例)
编辑:我想要一个适用于任意时间点序列的解决方案
任何帮助都将不胜感激
(注意:我正在使用“u”形式的
dplyr
函数来满足CRAN包的要求。)您可以使用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
df%>%
分组依据(id)%>%
汇总(分钟(时间[总体>0]),
滞后(时间)[min(其中(总体>0))]
>df%>%
+分组依据(id)%>%
+汇总(分钟(时间[总体>0]),
+滞后(时间)[min(其中(总体>0))]
#一个tibble:3x3
id`min(时间[哪个(总体>0)])`lag(时间)[min(哪个(总体>0))]`
1 a 1 NA
2B21
3 c
我不确定我是否理解这个问题。在您的代码中尝试min(time)-1,该代码在这个特定示例中有效,但在一般情况下无效。我应该澄清一下,我希望该方法适用于任意时间点,就像@julien-navarre.Fantastic发布的解决方案一样!这正是我一直努力要做的。简洁明了。事实上,@julien navarre发布的解决方案不适用于一般时间点。例如,在上面的示例中,如果我将time=rep(1:4,each=3)
更改为time=rep(0:3,each=3)
,它将失败。