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

R语言tidy解决方案:移除列中重复子串并规整标识符列

Tidy风格处理标识符格式统一问题

先构造一个符合问题描述的示例数据框:

library(tidyverse)

df <- tibble(
  a = c("ID_123", "ID_123_01", "ID_123_02", "ID_456", "ID_456_A", "ID_456_B"),
  b = c("0", NA, NA, "0", NA, NA)
)

直接用tidyverse工具链一步到位处理:

result <- df %>%
  # 标记出每行对应的基础标识符(仅b为"0"的行有值)
  mutate(base_id = if_else(b == "0", a, NA_character_)) %>%
  # 上下填充,让同组的所有行都拿到基础标识符
  fill(base_id, .direction = "downup") %>%
  # 替换b列的NA:从a里剥掉基础标识符和前面的下划线,得到后缀
  mutate(b = if_else(is.na(b), str_remove(a, paste0("^", base_id, "_")), b)) %>%
  # 删掉临时用的辅助列
  select(-base_id)

运行后得到的result就是目标格式:

print(result)
#> # A tibble: 6 × 2
#>   a          b    
#>   <chr>      <chr>
#> 1 ID_123     0    
#> 2 ID_123_01  01   
#> 3 ID_123_02  02   
#> 4 ID_456     0    
#> 5 ID_456_A   A    
#> 6 ID_456_B   B

补充:处理乱序数据

如果你的数据不是按基础标识符连续排列的,可以用下面的方法匹配对应基础标识符:

# 构造乱序示例
df_disorder <- tibble(
  a = c("ID_123_01", "ID_456", "ID_123", "ID_456_B", "ID_123_02", "ID_456_A"),
  b = c(NA, "0", "0", NA, NA, NA)
)

result_disorder <- df_disorder %>%
  # 先提取所有基础标识符存成列表
  mutate(base_ids = list(filter(., b == "0")$a)) %>%
  # 给每行匹配对应的基础标识符(找a开头匹配的那个base_id)
  mutate(base_id = map2_chr(a, base_ids, ~ .y[str_detect(.x, paste0("^", .y))])) %>%
  # 替换b列NA值
  mutate(b = if_else(is.na(b), str_remove(a, paste0("^", base_id, "_")), b)) %>%
  # 清理临时列
  select(-base_ids, -base_id)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:45:27