R语言处理含冗余字符数字列:补零及前缀添加需求
处理R数据集number列多格式数字的解决方案
核心思路
针对每行数字数量不固定的情况,放弃separate(需预设固定列数),改用dplyr+purrr+stringr组合,逐行完成清洗、拆分单个数字处理、合并回字符串的流程,完美保留原行结构。
第一步:模拟示例数据
先构造和描述匹配的测试数据集:
library(dplyr) library(stringr) library(purrr) trial <- tibble( id = 1:3, grower_code = c("AB", "CD", "EF"), # 假设每行对应一个2位种植者代码 number = c("123, 45,, 6789", " 98765, xyz12", "1, 234567") )
1. 数字补零至6位(得到desiredTrial1)
先清洗无关字符,再拆分每个数字补零,最后合并回字符串:
desiredTrial1 <- trial %>% mutate( # 清洗流程:移除非数字/逗号字符→合并多余逗号/空格→清理首尾无效符号 cleaned = str_replace_all(number, "[^0-9,]", "") %>% str_replace_all("[,\\s]+", ",") %>% str_trim() %>% str_remove_all("^,|,$"), # 逐行处理:拆分数字→补零至6位→合并为字符串 formatted_number = map_chr(cleaned, ~{ if(.x == "") return("") str_split(.x, ",")[[1]] %>% str_pad(width = 6, side = "left", pad = "0") %>% paste(collapse = ", ") }) ) %>% select(id, formatted_number) # 保留原行结构
2. 拼接2位种植者代码(得到desiredTrial2)
在补零的基础上,用map2_chr同时传递种植者代码和清洗后的数字字符串,逐个完成拼接:
desiredTrial2 <- trial %>% mutate( cleaned = str_replace_all(number, "[^0-9,]", "") %>% str_replace_all("[,\\s]+", ",") %>% str_trim() %>% str_remove_all("^,|,$"), # 同步处理数字和种植者代码 formatted_with_grower = map2_chr(cleaned, grower_code, ~{ if(.x == "") return("") str_split(.x, ",")[[1]] %>% str_pad(width = 6, side = "left", pad = "0") %>% paste0(.y, .) %>% # 将种植者代码拼接至每个数字前 paste(collapse = ", ") }) ) %>% select(id, formatted_with_grower)
3. 可选:按数值排序
如果需要对每行内的数字按数值排序,只需在拆分后转数值排序再执行后续处理:
desiredTrial_sorted <- trial %>% mutate( cleaned = str_replace_all(number, "[^0-9,]", "") %>% str_replace_all("[,\\s]+", ",") %>% str_trim() %>% str_remove_all("^,|,$"), formatted_sorted = map2_chr(cleaned, grower_code, ~{ if(.x == "") return("") # 转数值排序→补零→拼接种植者代码→合并 nums <- str_split(.x, ",")[[1]] %>% as.numeric() sort(nums) %>% str_pad(width = 6, side = "left", pad = "0") %>% paste0(.y, .) %>% paste(collapse = ", ") }) ) %>% select(id, formatted_sorted)
内容的提问来源于stack exchange,提问作者hacktacular42
相关产品推荐
相关产品推荐

