You need to enable JavaScript to run this app. 如何在R中按分组填充data frame中事件与ID列的空缺值
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 02:03:01