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
相关产品推荐
相关产品推荐

