在dplyr::mutate期间重用上一行的值
我试图根据事件发生的时间对事件进行分组。为了实现这一点,我只需在时间戳上计算一个diff,如果diff大于某个值,我就想本质上启动一个新组。我会像下面的代码一样尝试。但是,这不起作用,因为对话框变量在创建它的过程中不可用在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
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这真是太棒了!非常感谢。