R语言如何根据threshold阈值变化对dataframe执行指定差值计算
R 阈值分段差值计算实现
你可以通过连续阈值分组+分组匹配计算的方式实现需求,以下是完整可运行代码:
步骤1:构造示例数据
time <- c(1,2,3,4,5,6,7,8,9,10,11,12) threshold <- c(1,1,1,0,0,2,2,1,1,2,2,0) value <- c(5,3,2,4,6,9,1,10,3,5,2,4) df <- data.frame(time, threshold, value)
步骤2:加载依赖包并执行计算
仅需dplyr即可完成,无需引入其他额外依赖:
library(dplyr) df_result <- df %>% # 给连续相同的threshold段分配唯一组号 mutate(seg_id = cumsum(threshold != lag(threshold, default = first(threshold)))) %>% # 按组计算每组的阈值类型、组首value、组结束行号 group_by(seg_id) %>% mutate( seg_threshold = first(threshold), seg_first_value = first(value), seg_end_row = cur_group_rows()[n()] ) %>% ungroup() %>% # 按规则计算结果列 mutate( result = case_when( # 判断当前行是否为上一个阈值段的切换位置 lag(seg_end_row) == row_number() ~ case_when( lag(seg_threshold) == 1 ~ lag(seg_first_value) - value, lag(seg_threshold) == 2 ~ value - lag(seg_first_value), TRUE ~ NA_real_ ), TRUE ~ NA_real_ ) ) %>% # 移除辅助计算列 select(-c(seg_id, seg_threshold, seg_first_value, seg_end_row))
输出结果
运行后得到的df_result如下:
| time | threshold | value | result |
|---|---|---|---|
| 1 | 1 | 5 | NA |
| 2 | 1 | 3 | NA |
| 3 | 1 | 2 | NA |
| 4 | 0 | 4 | 1 |
| 5 | 0 | 6 | NA |
| 6 | 2 | 9 | NA |
| 7 | 2 | 1 | NA |
| 8 | 1 | 10 | 1 |
| 9 | 1 | 3 | NA |
| 10 | 2 | 5 | 5 |
| 11 | 2 | 2 | NA |
| 12 | 0 | 4 | -1 |
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

