R语言计算DF每行中大于等于指定阈值的连续值最大长度
R实现行内连续符合阈值序列最大长度统计
针对百万行量级的数值矩阵/数据框,可通过以下方案实现每行数值>=指定阈值的连续序列最大长度统计,新增为结果列:
核心逻辑
- 对每行数值生成布尔判断序列:
值 >= 阈值返回TRUE,否则返回FALSE - 用游程编码函数
rle()统计连续相同布尔值的长度 - 筛选出值为TRUE的游程长度,取最大值即为该行的统计结果,无符合条件的序列时返回0
基础R实现代码
# 生成10x10示例矩阵 df <- replicate(10, sample(0:5, 10, rep=T)) # 设定阈值 threshold <- 3 # 定义统计函数 max_consecutive <- function(row_vec) { rle_res <- rle(row_vec >= threshold) true_runs <- rle_res$lengths[rle_res$values] ifelse(length(true_runs) == 0, 0, max(true_runs)) } # 逐行计算,新增为结果列 df <- cbind(df, max_consec = apply(df, 1, max_consecutive))
测试样例行:
c(2,4,3,3,4,5,1,0,5,1)代入函数计算得到结果为5,符合预期。
百万行量级优化方案(data.table版)
基础R的apply在百万行规模下效率较低,用data.table的行遍历可以大幅提升速度:
library(data.table) # 转成data.table格式 dt <- as.data.table(df) threshold <- 3 # 逐行计算 dt[, max_consec := { rle_res <- rle(unlist(.SD) >= threshold) true_runs <- rle_res$lengths[rle_res$values] fifelse(length(true_runs) == 0, 0, max(true_runs)) }, by = 1:nrow(dt)] # 如果需要转回矩阵格式 res_mat <- as.matrix(dt)
内容的提问来源于stack exchange,提问作者david glen
相关产品推荐
相关产品推荐

