在 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" 的 运行 长度。
- 我如何找到仅归因于 "bad" 的 5 个最大的运行?
- 如何获取仅 "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)
我有一个包含 1 列的数据框。此列中的值只能是 "good" 或 "bad"。我想找到 "bad" 的前 5 大运行。
我可以使用 rle(df) 函数获取所有 "good" 和 "bad" 的 运行 长度。
- 我如何找到仅归因于 "bad" 的 5 个最大的运行?
- 如何获取仅 "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)