You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中无ID列时填充多组起始与结束值间的内容

在无ID列的R数据框中填充多组起始/结束标记间的NA值

原始数据结构如下:

df <- structure(
  list(
    elevation = c(150L,140L, 130L, 120L, 110L, 120L, 130L, 140L, 150L, 90L, 80L, 70L,66L, 60L, 50L, 66L, 70L, 72L, 68L, 65L, 60L, 68L, 70L),
    code = c(NA, NA, "W", NA, NA, NA, "W", NA, NA, NA, NA, NA, "X", NA, NA, "X", NA, NA, "Y", NA, NA, "Y", NA)
  ), 
  class = "data.frame", 
  row.names = c(NA,-23L)
)

需求是将code列中每组起始与结束标记(如W、X、Y)之间的NA值填充为对应标记值。

解决方案1:使用dplyr + tidyr

通过生成临时分组ID划分标记区间,再双向填充NA值:

library(dplyr)
library(tidyr)

df_filled <- df %>%
  # 生成分组ID:每遇到非NA的code值,分组序号递增
  mutate(group_id = cumsum(!is.na(code))) %>%
  # 按分组双向填充code值
  group_by(group_id) %>%
  fill(code, .direction = "downup") %>%
  ungroup() %>%
  # 移除临时分组列
  select(-group_id)

# 查看结果
df_filled

解决方案2:使用data.table

用data.table的nafill函数实现高效填充:

library(data.table)

setDT(df)
# 生成分组ID
df[, group_id := cumsum(!is.na(code))]
# 先向下填充,再向上填充补全区间
df[, code := nafill(code, type = "locf"), by = group_id]
df[, code := nafill(code, type = "nocb"), by = group_id]
# 移除临时分组列
df[, group_id := NULL]

# 查看结果
df

两种方法核心逻辑一致:通过非NA标记划分独立区间,将区间内的NA值替换为对应标记值。

内容的提问来源于stack exchange,提问作者AnonX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:30:53