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

时间:2017-12-04 09:21:05

标签: 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

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

a 3
b 4
c 2

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

1 个答案:

答案 0 :(得分:6)

我们可以使用rleid中的data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(demo_df)),按照&#39; var&#39;的非NA元素的游程长度id进行分组。和&#39; var&#39;,得到计数(.N),然后用第二个[],按&#39; var&#39;分组,得到max指定&#39;我&#39;使用is.nana.rm=TRUE

中使用max
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

如果我们需要dplyr解决方案

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