R语言data.frame按ID分组填充W标记区间的code值
R实现:按ID分组填充区间内的W标记
核心逻辑:在每个ID分组内,累计统计W的出现次数,累计次数为奇数的行区间就是需要填充W的范围(第一个W出现后累计数为1<奇数>,到第二个W出现累计数为2<偶数>,中间所有行都属于两个W的闭区间,完全匹配填充需求)。
可运行实现代码
方法1:base R(无额外包依赖)
df$code <- ave( df$code, df$ID, FUN = function(x) { # 定位分组内所有W的位置 is_w <- !is.na(x) & x == "W" # 标记需要填充的区间:累计W次数为奇数的范围 fill_flag <- cumsum(is_w) %% 2 == 1 ifelse(fill_flag, "W", x) } )
方法2:tidyverse/dplyr 实现(兼容常规数据分析流程)
library(dplyr) library(tidyr) df <- df %>% group_by(ID) %>% mutate( is_w = code == "W", fill_flag = cumsum(replace_na(is_w, FALSE)) %% 2 == 1, code = ifelse(fill_flag, "W", code) ) %>% ungroup() %>% select(-is_w, -fill_flag)
方法3:data.table 实现(适合大数据量场景)
library(data.table) setDT(df) df[, code := ifelse(cumsum((!is.na(code) & code == "W")) %% 2 == 1, "W", code), by = ID ]
结果验证
运行任意一种方法后,输出结果和预期填充效果完全一致,无需手动调整。
内容的提问来源于stack exchange,提问作者shiny
相关产品推荐
相关产品推荐

