在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
代码逻辑说明
rle(x):对输入数组做游程编码,返回包含两个元素的列表:lengths:每个连续重复值的长度values:对应的连续重复值
- 通过
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
相关产品推荐
相关产品推荐

