假设我有一个像这样构建的数据框:
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.任何帮助将不胜感激.
我们可以使用rleid从data.table.将'data.frame'转换为'data.table'(setDT(demo_df)),按'var'和'var'的非NA元素的run-length-id分组,得到count(.N),然后用second [],分组通过"变种",拿到max指定的"我"与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
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)