基于滑动窗口20年年龄区间蓄积占比的林分同龄/异龄分类方法
完全可以用滑动窗口实现该需求,核心实现逻辑如下:
对每个林分分组后先按年龄升序排序,以每个林木层的年龄为窗口左边界,统计所有年龄落在「左边界年龄 ~ 左边界年龄+20年」区间内的林木层总蓄积占比,只要所有窗口的最大占比超过80%,就判定为同龄林,否则为异龄林。
完整实现代码
library(dplyr) df <- data.frame(stand = c("id1", "id1", "id1", "id1", 'id2', 'id2', 'id2'), strat = c(1,2,3,4, 1,2,3), v = c(4,10,15,20, 11,15,18), age = c(5,10,65,80, 10,15,20)) result <- df %>% group_by(stand) %>% mutate( V_tot = sum(v), V_share = v/V_tot*100 ) %>% # 分组计算每个林分的最大20年区间蓄积占比 group_modify(~{ ages <- .x$age shares <- .x$V_share # 遍历每个年龄作为左端点,计算对应20年区间的总占比,取最大值 max_window_share <- max(sapply(ages, function(left_age){ sum(shares[ages >= left_age & ages <= left_age + 20]) })) .x$quality <- ifelse(max_window_share > 80, "even-aged", "uneven-aged") .x }) %>% ungroup()
结果验证
运行代码得到的输出和你给出的预期完全匹配:
- id1的最大20年区间为65~85岁,对应蓄积占比为30.6%+40.8%=71.4%,未达到80%,判定为异龄林(uneven-aged)
- id2的最大20年区间为10~30岁,对应蓄积占比100%,超过80%,判定为同龄林(even-aged)
该方案仅依赖你已经在用的dplyr包即可运行,不需要额外安装其他依赖,适配性更强。
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

