Mysql 基于dbplyr中时间戳序列的新列变异

Mysql 基于dbplyr中时间戳序列的新列变异,mysql,r,postgresql,dplyr,dbplyr,Mysql,R,Postgresql,Dplyr,Dbplyr,我有一个来自PostgreSQLDB的数据集,我有两列: id=参与者的id 时间戳=记录测量的时间戳 我需要使用dbplyr,以便根据time\u stamp的顺序变异一个新列。换句话说,如果时间戳是按顺序排列的(意味着它是在一分钟间隔内),则这被识别为一个事件 例如,这是我的数据集: 库(dplyr) 图书馆(dbplyr) 图书馆(lubridate) mf% 收集()%>% 变异(时间戳=作为日期时间(时间戳)) #>#tibble:15 x 2 #>id时间戳 #>

我有一个来自
PostgreSQL
DB的数据集,我有两列:


id
=参与者的id

时间戳
=记录测量的时间戳


我需要使用
dbplyr
,以便根据
time\u stamp
的顺序变异一个新列。换句话说,如果
时间戳
是按顺序排列的(意味着它是在一分钟间隔内),则这被识别为一个事件

例如,这是我的数据集:

库(dplyr)
图书馆(dbplyr)
图书馆(lubridate)
mf%
收集()%>%
变异(时间戳=作为日期时间(时间戳))
#>#tibble:15 x 2
#>id时间戳
#>                  
#>id001 2021-01-01 08:00:00
#>2 id001 2021-01-01 08:01:00
#>3 id001 2021-01-01 08:02:00
#>4 id001 2021-01-01 08:03:00
#>5 id001 2021-01-01 08:05:00
#>6 id001 2021-01-01 08:06:00
#>7 id001 2021-01-01 08:07:00
#>8 id001 2021-01-01 08:08:00
#>9 id001 2021-01-01 08:12:00
#>10 id001 2021-01-01 08:13:00
#>11 id001 2021-01-01 08:14:00
#>12 id001 2021-01-01 08:15:00
#>13 id001 2021-01-01 08:16:00
#>14 id001 2021-01-01 08:17:00
#>15 id001 2021-01-01 08:18:00
现在,我需要识别事件。也就是说,查找发生在序列中的时间戳(序列=1分钟间隔)。例如,这是我的预期输出:

#tible:15x3
#>id时间戳事件
#>                     
#>id001 2021-01-01 08:00:00事件1
#>2 id001 2021-01-01 08:01:00事件1
#>3 id001 2021-01-01 08:02:00事件1
#>4 id001 2021-01-01 08:03:00事件1
#>5 id001 2021-01-01 08:05:00事件2
#>6 id001 2021-01-01 08:06:00事件2
#>7 id001 2021-01-01 08:07:00事件2
#>8 id001 2021-01-01 08:08:00事件2
#>9 id001 2021-01-01 08:12:00事件3
#>10 id001 2021-01-01 08:13:00事件3
#>11 id001 2021-01-01 08:14:00事件3
#>12 id001 2021-01-01 08:15:00事件3
#>13 id001 2021-01-01 08:16:00事件3
#>14 id001 2021-01-01 08:17:00事件3
#>15 id001 2021-01-01 08:18:00事件3
请注意,从第
4行到第
5行,间隔为2分钟–导致下一个事件开始。从第
8行到第
9行的情况也一样:间隔4分钟,然后开始下一个事件

PS:我需要它在
dbplyr
中完全工作,也就是说:不使用
collect()

任何想法都将不胜感激


谢谢大家!

这里是使用逻辑
1分钟
差分平均值1事件的代码

mf %>% 
  collect() %>% 
  mutate(time_stamp = as_datetime(time_stamp)) %>%
  mutate(diff_mins = difftime(time_stamp, lag(time_stamp, 1), units = "mins")) %>%
  mutate(event_count = if_else(diff_mins == 1 | is.na(diff_mins), 0, 1)) %>%
  mutate(event_index = paste0("event_", cumsum(event_count) + 1))
输出:

# A tibble: 15 x 5
   id    time_stamp          diff_mins event_count event_index
   <chr> <dttm>              <drtn>          <dbl> <chr>      
 1 id001 2021-01-01 08:00:00 NA mins             0 event_1    
 2 id001 2021-01-01 08:01:00  1 mins             0 event_1    
 3 id001 2021-01-01 08:02:00  1 mins             0 event_1    
 4 id001 2021-01-01 08:03:00  1 mins             0 event_1    
 5 id001 2021-01-01 08:05:00  2 mins             1 event_2    
 6 id001 2021-01-01 08:06:00  1 mins             0 event_2    
 7 id001 2021-01-01 08:07:00  1 mins             0 event_2    
 8 id001 2021-01-01 08:08:00  1 mins             0 event_2    
 9 id001 2021-01-01 08:12:00  4 mins             1 event_3    
10 id001 2021-01-01 08:13:00  1 mins             0 event_3    
11 id001 2021-01-01 08:14:00  1 mins             0 event_3    
12 id001 2021-01-01 08:15:00  1 mins             0 event_3    
13 id001 2021-01-01 08:16:00  1 mins             0 event_3    
14 id001 2021-01-01 08:17:00  1 mins             0 event_3    
15 id001 2021-01-01 08:18:00  1 mins             0 event_3    
#一个tible:15 x 5
id时间戳差异分钟事件计数事件索引
id001 2021-01-01 08:00:00 NA分钟0事件
2 id001 2021-01-01 08:01:00 1分钟0事件
3 id001 2021-01-01 08:02:00 1分钟0事件
4 id001 2021-01-01 08:03:00 1分钟0事件
5 id001 2021-01-01 08:05:00 2分钟1事件2
6 id001 2021-01-01 08:06:00 1分钟0事件2
7 id001 2021-01-01 08:07:00 1分钟0事件2
8 id001 2021-01-01 08:08:00 1分钟0事件2
9 id001 2021-01-01 08:12:00 4分钟1事件
10 id001 2021-01-01 08:13:00 1分钟0事件3
11 id001 2021-01-01 08:14:00 1分钟0事件3
12 id001 2021-01-01 08:15:00 1分钟0事件3
13 id001 2021-01-01 08:16:00 1分钟0事件3
14 id001 2021-01-01 08:17:00 1分钟0事件3
15 id001 2021-01-01 08:18:00 1分钟0事件3

以下是使用逻辑的代码
1分钟
差异平均值1事件

mf %>% 
  collect() %>% 
  mutate(time_stamp = as_datetime(time_stamp)) %>%
  mutate(diff_mins = difftime(time_stamp, lag(time_stamp, 1), units = "mins")) %>%
  mutate(event_count = if_else(diff_mins == 1 | is.na(diff_mins), 0, 1)) %>%
  mutate(event_index = paste0("event_", cumsum(event_count) + 1))
输出:

# A tibble: 15 x 5
   id    time_stamp          diff_mins event_count event_index
   <chr> <dttm>              <drtn>          <dbl> <chr>      
 1 id001 2021-01-01 08:00:00 NA mins             0 event_1    
 2 id001 2021-01-01 08:01:00  1 mins             0 event_1    
 3 id001 2021-01-01 08:02:00  1 mins             0 event_1    
 4 id001 2021-01-01 08:03:00  1 mins             0 event_1    
 5 id001 2021-01-01 08:05:00  2 mins             1 event_2    
 6 id001 2021-01-01 08:06:00  1 mins             0 event_2    
 7 id001 2021-01-01 08:07:00  1 mins             0 event_2    
 8 id001 2021-01-01 08:08:00  1 mins             0 event_2    
 9 id001 2021-01-01 08:12:00  4 mins             1 event_3    
10 id001 2021-01-01 08:13:00  1 mins             0 event_3    
11 id001 2021-01-01 08:14:00  1 mins             0 event_3    
12 id001 2021-01-01 08:15:00  1 mins             0 event_3    
13 id001 2021-01-01 08:16:00  1 mins             0 event_3    
14 id001 2021-01-01 08:17:00  1 mins             0 event_3    
15 id001 2021-01-01 08:18:00  1 mins             0 event_3    
#一个tible:15 x 5
id时间戳差异分钟事件计数事件索引
id001 2021-01-01 08:00:00 NA分钟0事件
2 id001 2021-01-01 08:01:00 1分钟0事件
3 id001 2021-01-01 08:02:00 1分钟0事件
4 id001 2021-01-01 08:03:00 1分钟0事件
5 id001 2021-01-01 08:05:00 2分钟1事件2
6 id001 2021-01-01 08:06:00 1分钟0事件2
7 id001 2021-01-01 08:07:00 1分钟0事件2
8 id001 2021-01-01 08:08:00 1分钟0事件2
9 id001 2021-01-01 08:12:00 4分钟1事件
10 id001 2021-01-01 08:13:00 1分钟0事件3
11 id001 2021-01-01 08:14:00 1分钟0事件3
12 id001 2021-01-01 08:15:00 1分钟0事件3
13 id001 2021-01-01 08:16:00 1分钟0事件3
14 id001 2021-01-01 08:17:00 1分钟0事件3
15 id001 2021-01-01 08:18:00 1分钟0事件3

不使用
collect
意味着我们仅限于dplyr函数,因为这些函数定义了SQL翻译

与@Sinh_Nguyen非常相似,我建议如下:

output=mf%>%
分组依据(id)%>%
安排(时间戳)%>%
突变(上一个时间戳=滞后(时间戳,1))%>%
变异(小时差异=日期部分(“小时”,时间戳-上一个时间戳),
min_part_diff=日期部分('minute',time_stamp-prev_time_stamp))%>%
突变(间隙=小时差异*60+分钟部分差异)%>%
突变(is_gap=ifelse(is.na(prev_time_stamp)| gap==1,0,1))%>%
突变(事件索引=总和(是差距))
注:

  • groupby
    arrange
    在开始时只发生一次,但是
    lag
    cumsum
    函数会隐式使用
  • 如果dbplyr没有定义转换,那么它将按原样传递命令。编写
    DATEPART<