找到运行时间最长的不间断系列

Jas*_*hah 2 r

假设我有一个像这样构建的数据框:

library(lubridate)

seq_date <- rep(seq.Date(from = dmy('01-01-2016'), to = dmy('05-01-2016'), by = 'day'), 3)

vec_a <- c(rep('a', 3), NA, 'a')
vec_b <- c(rep('b', 4), NA)
vec_c <- c(NA, rep('c', 2), NA, 'c')

demo_df <- data.frame(date = seq_date,
                      var = c(vec_a, vec_b, vec_c)) 

demo_df
         date  var
1  2016-01-01    a
2  2016-01-02    a
3  2016-01-03    a
4  2016-01-04 <NA>
5  2016-01-05    a
6  2016-01-01    b
7  2016-01-02    b
8  2016-01-03    b
9  2016-01-04    b
10 2016-01-05 <NA>
11 2016-01-01 <NA>
12 2016-01-02    c
13 2016-01-03    c
14 2016-01-04 <NA>
15 2016-01-05    c
Run Code Online (Sandbox Code Playgroud)

我想知道的是每个运行时间最长的不间断序列var.预期的输出应该是:

a 3
b 4
c 2
Run Code Online (Sandbox Code Playgroud)

var在同一日期开始和结束的三个类别中的每一个和一系列将始终被a打破NA.任何帮助将不胜感激.

akr*_*run 7

我们可以使用rleiddata.table.将'data.frame'转换为'data.table'(setDT(demo_df)),按'var'和'var'的非NA元素的run-length-id分组,得到count(.N),然后用second [],分组通过"变种",拿到max指定的"我"与is.na或使用na.rm=TRUEmax

library(data.table)
setDT(demo_df)[, .N, .(var, rleid(!is.na(var)))][!is.na(var), .(count = max(N)), var]
#    var count
#1:   a     3
#2:   b     4
#3:   c     2
Run Code Online (Sandbox Code Playgroud)

如果我们需要dplyr解决方案

library(dplyr)
demo_df %>% 
   count(grp = cumsum(is.na(var)), var)  %>%
   filter(!is.na(var)) %>% 
   group_by(var) %>%
   summarise(Count = max(n))
Run Code Online (Sandbox Code Playgroud)