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

问题描述 投票:0回答:2

我有一个带有1列的数据框。此列中的值只能是“好”或“坏”。我想找到“坏”的前5大运行情况。

我能够使用rle(df)函数来获取所有“好”和“坏”的运行时间。

  1. 我如何找到仅归因于“不良”的5个最大运行?
  2. 我如何仅得出“不良”而获得前5大运行的起始和结束索引?

非常感谢您的协助!

r run-length-encoding
2个回答
0
投票

sort(...)函数通过增加或减少顺序来排列事物。默认值为增加,但是您可以设置“减少= TRUE”。使用?sort获取更多信息。

which(...)函数返回满足逻辑条件的值的INDEX。下面的代码对行的时间列进行排序,其中好值==良好。

sort(your.df$times[which(your.df$goodbad == GOOD)])

如果您想获得前五名,可以这样做:

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]

0
投票

一个选项是rleid。将'data.frame'转换为'data.table'(setDT(df1)),使用rleid创建分组列(根据相邻的不匹配元素生成唯一ID,创建每组元素的数量(n )作为列,行号也作为另一列('rn'),将'goodbad'为“ bad”,order'n'降序排列的行子集,按'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)
© www.soinside.com 2019 - 2024. All rights reserved.