R中如何计算trigger=1行与上方最近非NA数值的差值
R实现触发行与上方最近有效值差值计算的方案
两种方案均支持普通场景和trigger相邻的场景,不需要额外判断触发点间隔。
方法1:tidyverse实现(推荐,代码简洁易读)
# 加载依赖 library(tidyverse) # 构造测试数据,可替换为自己的数据集 df <- tibble( trigger = c(0,0,0,1,0,1,0), values = c(3, NA, NA, 5, 4, 5, 10) ) # 核心计算逻辑 df_result <- df %>% mutate( # 临时把触发行的数值置空,避免把自身算入最近有效值 temp_val = ifelse(trigger == 1, NA, values) ) %>% # 向下填充非空值,得到每行上方最近的有效数值 fill(temp_val, .direction = "down") %>% mutate( # 仅触发行计算差值,其余行保留空值 difference = ifelse(trigger == 1, values - temp_val, NA) ) %>% # 删除临时辅助列 select(-temp_val)
方法2:base R实现(无需安装额外依赖)
# 构造测试数据,可替换为自己的数据集 df <- data.frame( trigger = c(0,0,0,1,0,1,0), values = c(3, NA, NA, 5, 4, 5, 10) ) # 遍历计算每行对应的上方最近有效值 last_valid <- c() current_val <- NA for (i in 1:nrow(df)) { if (df$trigger[i] != 1 && !is.na(df$values[i])) { current_val <- df$values[i] } last_valid[i] <- current_val } # 生成差值列 df$difference <- ifelse(df$trigger == 1, df$values - last_valid, NA)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

