Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr查找具有指定条件的行*和*一组相关行_R_Dplyr - Fatal编程技术网

使用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)
,它将失败。