如何在R中按分组填充data frame中事件与ID列的空缺值
解决方案
你可以使用tidyverse生态的dplyr和tidyr包实现需求,核心逻辑是给每个start到end的事件段分配独立分组,仅在分组内向前填充空值,区间外的空值保留原样。
完整代码
# 加载依赖包 library(dplyr) library(tidyr) # 示例数据 a <- c(seq(from = 150, to = 213, by = 3)) b <- c("start","","","mid","","end","", "", "start", "", "", "end", "", "", "", "start", "", "end", "start", "mid", "", "end") c <- c("A","","","A","","A","", "", "A", "", "", "A", "", "", "", "B", "", "B", "B", "B", "", "B") data <- data.frame(value = a, event = b, ID = c) # 数据处理 result <- data %>% # 将空字符串转为NA,方便填充函数识别 mutate(across(c(event, ID), ~ na_if(., ""))) %>% # 为每个start开头的事件段分配唯一分组ID mutate(segment_id = cumsum(event == "start" & !is.na(event))) %>% group_by(segment_id) %>% # 定位当前分组end的位置,仅填充end之前的行 mutate(end_pos = which(event == "end"), need_fill = row_number() <= end_pos) %>% # 向下填充空值(用前一个非空值补全后续空值) fill(event, ID, .direction = "down") %>% # end之后的行恢复为空字符串 mutate(across(c(event, ID), ~ ifelse(!need_fill, "", .))) %>% ungroup() %>% # 移除计算用的辅助列 select(-segment_id, -end_pos, -need_fill) %>% # 剩余NA转回空字符串,和输出格式匹配 mutate(across(c(event, ID), ~ replace(., is.na(.), "")))
运行后得到的result与你给出的期望输出goal完全一致。
内容的提问来源于stack exchange,提问作者celow
相关产品推荐
相关产品推荐

