如何在R data.table中对字符串类型数据进行范围分组?
问题描述
我有一个包含Code和Description列的样本数据集,想要创建新列Code Group,将特定范围的编码分组(比如把编码在"912345"到"912350"之间的数据归入范围组"912345-912350")。但Code列是字符串类型,不能转换为整数(否则前导零会丢失,例如"0450"会变成450),请问如何对字符串类型的编码识别预定义范围并完成分组?
样本数据集可通过以下代码生成:
DT = data.table( Code = c("0450", "912345", "912346","912347","912348","912349","912350","7860","X7960"), Description = c("Desc A", "Desc B", "Desc C","Desc D","Desc E","Desc F","Desc G","Desc H","Desc I") )
附加规则:
- 编码无需连续,只要属于预定义范围,无论是否存在缺失编码,均归入对应范围组(例如若912347缺失,912345、912346、912348、912349、912350仍会被归入"912345-912350")
- 预定义范围均为纯数字范围,若编码包含字母,则
Code Group列值与原Code列值相同(如示例中的"X7960") - 仅对属于预定义范围列表的编码分组,不在范围内的编码(比如"7860"),
Code Group列值与原Code列值相同
解决方案
利用纯数字字符串的长度一致性和字典序与数值序等价的特性,可以在不转换为整数的前提下实现范围匹配,具体实现如下:
核心思路
- 先筛选出纯数字编码,排除含字母的编码
- 针对每个预定义范围,检查编码长度是否与范围起始/结束编码长度一致(避免不同长度的数字字符串误匹配,比如4位的"0450"不会和6位的范围比较)
- 通过字符串的字典序比较,判断编码是否在预定义的起始和结束之间
- 非纯数字或不在任何预定义范围的编码,直接保留原
Code值
代码实现
library(data.table) # 生成样本数据 DT = data.table( Code = c("0450", "912345", "912346","912347","912348","912349","912350","7860","X7960"), Description = c("Desc A", "Desc B", "Desc C","Desc D","Desc E","Desc F","Desc G","Desc H","Desc I") ) # 定义预定义范围列表,可添加多个范围 predefined_ranges = list( list(start = "912345", end = "912350", group_name = "912345-912350") # 示例:添加另一个范围 # list(start = "0400", end = "0500", group_name = "0400-0500") ) # 初始化Code_Group列为原Code值 DT[, Code_Group := Code] # 遍历每个预定义范围,匹配并更新分组 for (range in predefined_ranges) { # 构建匹配条件:纯数字、长度匹配、编码在范围区间内 match_mask = grepl("^\\d+$", Code) & nchar(Code) == nchar(range$start) & Code >= range$start & Code <= range$end DT[match_mask, Code_Group := range$group_name] } # 查看最终结果 print(DT)
输出结果
运行上述代码后,得到的数据集如下:
Code Description Code_Group 1: 0450 Desc A 0450 2: 912345 Desc B 912345-912350 3: 912346 Desc C 912345-912350 4: 912347 Desc D 912345-912350 5: 912348 Desc E 912345-912350 6: 912349 Desc F 912345-912350 7: 912350 Desc G 912345-912350 8: 7860 Desc H 7860 9: X7960 Desc I X7960
扩展说明
如果需要添加更多预定义范围,只需在predefined_ranges列表中新增对应的范围配置即可,代码会自动遍历所有范围完成匹配。这种方法既保留了编码的前导零,又能准确匹配预定义的数字范围,完全符合需求。
内容的提问来源于stack exchange,提问作者Jiamei
相关产品推荐
相关产品推荐

