You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按年份统计R数据框各列中值为0的最大连续行数

如何按年份统计R数据框各列中值为0的最大连续行数

我明白你现在的需求是按年份分组,统计数据框里每一列中值为0的最大连续行数,而且希望一次性处理所有列,不用挨个列单独处理对吧?你之前的尝试只能单列处理,那我们用data.table来实现批量处理就非常合适,效率也高。

首先先把你提供的示例数据整理好:

library(data.table)

# 你的示例数据集
data <- data.frame(YEAR = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
                   PREC1 = c(0, 0, 0, 1, 1, 4, 1, 0, 0, 4, 2, 1, 0, 0, 0, 0, 5, 2, 8, 0),
                   PREC2 = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 8, 0, 1),
                   PREC3 = c(0, 0, 12, 1, 3, 0, 0, 0, 0, 2, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0),
                   PREC4 = c(0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 9, 8, 0, 0),
                   PREC5 = c(0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 7, 1, 0, 1),
                   PREC6 = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 9, 6, 9, 0),
                   PREC7 = c(1, 0, 0, 0, 10, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 4, 2, 4, 1),
                   PREC8 = c(0, 0, 0, 1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0))

接下来是完整的批量处理代码,我会一步步解释关键逻辑:

# 1. 把数据框转为data.table格式,方便后续高效操作
setDT(data)

# 2. 将宽表转为长表,让所有数值列统一在一个字段里,这样就能批量处理所有列
long_data <- melt(data, id.vars = "YEAR", variable.name = "COLUMN", value.name = "VALUE")

# 3. 核心计算:按年份和列名分组,统计最大连续0的行数
result <- long_data[, .(
  # 用rleid标记连续的0/非0组:连续的0会被分配同一个组ID,出现非0则组ID递增
  group_id = rleid(VALUE == 0)
), by = .(YEAR, COLUMN)][
  # 只筛选出值为0的组
  VALUE == 0, .(consecutive_count = .N), by = .(YEAR, COLUMN, group_id)][
    # 对每个年份+列名的组合,取最大的连续0行数
    , .(max_consecutive_0 = max(consecutive_count)), by = .(YEAR, COLUMN)
  ]

# 4. 可选:把结果转回宽表,和原数据的列结构对应,查看更直观
result_wide <- dcast(result, YEAR ~ COLUMN, value.var = "max_consecutive_0")

# 输出结果
print(result_wide)

关键逻辑解释:

  • melt:把原来的宽表(每列是一个PREC指标)转成长表,这样所有的PREC列都变成COLUMN字段的不同取值,我们就不用为每个列单独写处理逻辑了。
  • rleid(VALUE == 0):data.table的这个函数专门用来生成连续相同值的组ID,完美解决连续值的分组问题——连续的0会被标记为同一个ID,一旦遇到非0,ID就会+1,这样我们就能把每一段连续的0单独拎出来。
  • 两次分组聚合:先计算每一段连续0的长度,再取每个年份+列的最大值,最终得到我们需要的结果。

运行代码后,result_wide的输出如下(和示例数据完全对应):

YEAR PREC1 PREC2 PREC3 PREC4 PREC5 PREC6 PREC7 PREC8
1:    1     3     4     2     4     4     4     3     3
2:    2     2     4     4     4     4     4     4     4
3:    3     3     3     3     3     3     3     3     3
4:    4     1     2     5     2     1     1     1     2

备注:内容来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:49:52