向量连续0最大长度与平均长度计算问题求解
实现方案
R 自带的 rle() 游程编码函数可以直接实现该需求,它会自动统计向量中连续相同值的长度和对应取值,你只需要封装成自定义函数,再传入 apply 即可批量处理多组数据。
步骤1:封装统计函数
calc_zero_stats <- function(input_vec) { # 计算输入向量的游程编码 run_res <- rle(input_vec) # 筛选所有取值为0的连续段长度 zero_lengths <- run_res$lengths[run_res$values == 0] # 处理向量中无0的边界情况 if (length(zero_lengths) == 0) { return(c(max_zero = 0, avg_zero = 0)) } # 计算两个目标指标 max_len <- max(zero_lengths) avg_len <- mean(zero_lengths) return(c(max_zero = max_len, avg_zero = avg_len)) }
效果测试
用你给出的示例向量测试:
test_vec <- c(1,1,0,0,0,1,1,1,1,0,0,1,1,1,0) calc_zero_stats(test_vec)
输出结果为 max_zero=3、avg_zero=2,和你的预期完全一致。
步骤2:结合 apply 批量处理
如果你的多组观测按行存放在矩阵/数据框中,按行遍历计算即可:
# 示例构造3组观测的矩阵,每行为一组待计算向量 data_mat <- rbind( c(1,1,0,0,0,1,1,1,1,0,0,1,1,1,0), c(0,0,1,0,1,1,0,0,0,0,1,0,1,1,1), c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) ) # MARGIN=1 表示按行遍历,结果转置后每行对应一组观测的统计值 result <- t(apply(data_mat, MARGIN = 1, FUN = calc_zero_stats))
如果你的观测按列存放,把 MARGIN 参数改为 2 即可。
内容的提问来源于stack exchange,提问作者user3483060
相关产品推荐
相关产品推荐

