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

在R中计算数组非零值间连续零个数(降水事件间隔统计)

统计数组中连续零段的长度(降水间隔天数场景)

给定两个R数组:

a <- c(0.1,0.2,0,0,0,0,1.2,1.4,0,0,1.4)
b <- c(0,0,0,1.1,0,0,0,0,0.25,0.51,0)

需要统计数组中所有连续零段的长度,对应预期输出:

  • 数组a:(4, 2)
  • 数组b:(3, 4, 1)
    该需求对应实际场景中的降水间隔天数统计(无降水的连续天数)。

实现代码

利用R内置的rle()游程编码函数可以高效实现需求,直接统计连续重复值的长度:

# 定义统计连续零段长度的函数
count_zero_runs <- function(x) {
  # 对数组进行游程编码
  run_info <- rle(x)
  # 提取所有值为0的游程对应的长度
  run_info$lengths[run_info$values == 0]
}

# 测试数组a
count_zero_runs(a)
# 输出:4 2

# 测试数组b
count_zero_runs(b)
# 输出:3 4 1

代码逻辑说明

  1. rle(x):对输入数组做游程编码,返回包含两个元素的列表:
    • lengths:每个连续重复值的长度
    • values:对应的连续重复值
  2. 通过run_info$values == 0筛选出所有连续零的游程,提取对应的lengths即可得到结果。

进阶调整:仅统计非零值之间的零段

如果实际需求是只保留被非零值夹在中间的零段(排除开头/结尾的零段,严格对应两次降水事件的间隔),可以调整代码如下:

count_between_nonzero_zeros <- function(x) {
  run_info <- rle(x != 0)  # 用非零逻辑值编码,合并连续非零为一个TRUE段
  # 筛选前后都是非零段的零段
  valid_indices <- which(
    run_info$values == FALSE & 
    c(FALSE, run_info$values[-length(run_info$values)]) & 
    c(run_info$values[-1], FALSE)
  )
  run_info$lengths[valid_indices]
}

# 测试数组a,结果仍为4 2
count_between_nonzero_zeros(a)

# 测试数组b,结果为4(仅中间的零段)
count_between_nonzero_zeros(b)

内容的提问来源于stack exchange,提问作者Sumon Datta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:15:41