我有一个带有1列的数据框。此列中的值只能是“好”或“坏”。我想找到“坏”的前5大运行情况。
我能够使用rle(df)函数来获取所有“好”和“坏”的运行时间。
非常感谢您的协助!
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]
一个选项是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)