在dplyr::mutate期间重用上一行的值

在dplyr::mutate期间重用上一行的值,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我试图根据事件发生的时间对事件进行分组。为了实现这一点,我只需在时间戳上计算一个diff,如果diff大于某个值,我就想本质上启动一个新组。我会像下面的代码一样尝试。但是,这不起作用,因为对话框变量在创建它的过程中不可用 library(tidyverse) df <- data.frame(time = c(1,2,3,4,5,510,511,512,513), id = c(1,2,3,4,5,6,7,8,9)) > df time id 1 1 1 2 2

我试图根据事件发生的时间对事件进行分组。为了实现这一点,我只需在时间戳上计算一个diff,如果diff大于某个值,我就想本质上启动一个新组。我会像下面的代码一样尝试。但是,这不起作用,因为对话框变量在创建它的过程中不可用

library(tidyverse)

df <- data.frame(time = c(1,2,3,4,5,510,511,512,513), id = c(1,2,3,4,5,6,7,8,9))

> df
  time id
1    1  1
2    2  2
3    3  3
4    4  4
5    5  5
6  510  6
7  511  7
8  512  8
9  513  9

df <- df %>% 
  mutate(t_diff = c(NA, diff(time))) %>% 
  # This generates an error as dialog is not available as a variable at this point
  mutate(dialog = ifelse(is.na(t_diff), id, ifelse(t_diff >= 500, id, lag(dialog, 1))))

# This is the desired result

> df
  time id t_diff dialog
1    1  1     NA      1
2    2  2      1      1
3    3  3      1      1
4    4  4      1      1
5    5  5      1      1
6  510  6    505      6
7  511  7      1      6
8  512  8      1      6
9  513  9      1      6
库(tidyverse)
df-df
时间id
1    1  1
2    2  2
3    3  3
4    4  4
5    5  5
6  510  6
7  511  7
8  512  8
9  513  9
df%
突变(t_diff=c(NA,diff(time))%>%
#这将生成一个错误,因为此时对话框作为变量不可用
变异(dialog=ifelse(is.na(t_diff),id,ifelse(t_diff>=500,id,lag(dialog,1)))
#这是期望的结果
>df
时间id t_diff对话框
1 NA 1
2    2  2      1      1
3    3  3      1      1
4    4  4      1      1
5    5  5      1      1
6  510  6    505      6
7  511  7      1      6
8  512  8      1      6
9  513  9      1      6
换句话说,我想添加一列,指向每个组的第一个元素。因此,在与前一元素的差值大于500的点处区分这些组

不幸的是,我还没有找到一个聪明的解决方法来有效地使用dplyr实现这一点。显然,使用循环迭代data.frame是可行的,但效率非常低


在dplyr中是否有实现这一点的方法?

df%>%mutate(group=cumsum(coalesce(t_diff,0)>500))%%>%groupby(group)%%>%mutate(dialog=first(id))
?在base R
转换中(df,dialog=ave(id,cumsum(c(0,diff(df$time))>500),FUN=function(x)x[1])
perhaps@Axeman这真是太棒了!谢谢大家!<代码>df%>%变异(组=总和(聚合(t_diff,0)>500))%>%group_by(组)%>%变异(对话框=第一个(id))?在基本R
转换中(df,dialog=ave(id,总和(c(0,diff(df$time))>500,FUN=function(x)x[1])
perhaps@Axeman这真是太棒了!非常感谢。