在 R 中:如何通过 1 列中频繁值的前 5 次最长运行对大型数据框进行子集化?

In R: How to subset a large dataframe by top 5 longest runs of frequent values in 1 column?

我有一个包含 1 列的数据框。此列中的值只能是 "good" 或 "bad"。我想找到 "bad" 的前 5 大运行。

我可以使用 rle(df) 函数获取所有 "good" 和 "bad" 的 运行 长度。

  1. 我如何找到仅归因于 "bad" 的 5 个最大的运行?
  2. 如何获取仅 "bad" 的前 5 个最大运行的开始和结束索引?

非常感谢您的帮助!

sort(...) 函数按升序或降序排列事物。默认是增加,但是你可以设置"decreasing = TRUE"。使用 ?sort 获取更多信息。

which(...) 函数 returns 满足逻辑条件的值的索引。下面的代码对 goodbad 值 == GOOD.

的行的时间列进行排序
sort(your.df$times[which(your.df$goodbad == GOOD)])

如果你想获得前 5 名,你可以这样做:

top5_good <- sort(your.df$times[which(your.df$goodbad == GOOD)])[1:5]

top5_bad <- sort(your.df$times[which(your.df$goodbad == BAD)])[1:5]

一个选项是rleid。将'data.frame'转换为'data.table'(setDT(df1)),用rleid创建分组列(根据相邻的不匹配元素生成唯一id,创建每组元素数(n) 作为一列,行号也作为另一列 ('rn'),将 'goodbad' 为 "bad"、order [=32] 的行子集=] 按降序排列,按 'grp' 分组,汇总 'first' 和 'last' 行号,以及 goodbad

的条目
library(data.table)
setDT(df1)[, grp := rleid(goodbad)][,  n := .N, grp][ ,
   rn := .I][goodbad == 'bad'][order(-n), .(goodbad = first(goodbad), 
    n = n, start = rn[1], last = rn[.N]), .(grp)
    ][n %in% head(unique(n), 5)][, grp := NULL][]

或者我们可以使用rle和其他base R方法

rl <- rle(df1$goodbad)
grp <- with(rl, rep(seq_along(values), lengths))
df2 <- transform(df1, grp = grp, n = rep(rl$lengths, rl$lengths),
            rn = seq_len(nrow(df1)))
df3 <- subset(df2, goodbad == 'bad')
do.call(data.frame, aggregate(rn ~ grp, subset(df3[order(-df3$n),], 
      n %in% head(unique(n), 5)), range))

数据

set.seed(24)
df1 <- data.frame(goodbad = sample(c("good", "bad"), 100,
          replace = TRUE), stringsAsFactors = FALSE)