假设我有一个这样构建的数据框:
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
打破。任何帮助将不胜感激。
答案 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.na
或na.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))