R语言将RLE计算结果添加至原始数据框新增字段的方法
实现方案
你可以直接通过RLE结果反向映射到原始行完成字段新增,以下是两种常用实现方式:
基础R实现(无第三方包依赖)
核心逻辑是把RLE输出的每个游程长度,按游程本身的长度重复对应次数,覆盖到原始数据的每一行,再把非高于均值的行统一置0即可。
# 以下为示例数据,实际使用时替换为你自己的数据框即可 df <- data.frame( Date = as.Date("2024-01-01") + 0:7, Events = c(2,5,6,1,7,8,3,2), `Above Average` = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE) ) # 对Above Average字段执行游程编码 rle_result <- rle(df$`Above Average`) # 按游程顺序把长度映射到每一行,非TRUE段统一标注0 mapped_length <- rep(rle_result$lengths, times = rle_result$lengths) df$`Run Above Av` <- ifelse(df$`Above Average`, mapped_length, 0)
运行后得到的Run Above Av字段值依次为0,2,2,0,2,2,0,0,完全匹配需求:连续高于均值的段统一标注对应游程长度,其余行标注0。
tidyverse/dplyr实现(适配管道工作流)
如果日常使用dplyr处理数据,可以借助consecutive_id()直接按连续值分组计算,无需手动调用RLE函数:
library(dplyr) df <- df %>% # 按连续相同的Above Average值划分游程组 group_by(run_group = consecutive_id(`Above Average`)) %>% # 组内行数即为游程长度,TRUE组保留长度,其余组置0 mutate(`Run Above Av` = ifelse(`Above Average`, n(), 0)) %>% ungroup() %>% select(-run_group)
注意:如果你的
Above Average字段是1/0的数值型而非逻辑型,把代码里的判断条件改成Above Average == 1即可正常运行。
内容的提问来源于stack exchange,提问作者Andrew Akester
相关产品推荐
相关产品推荐

