在R语言中识别供应商连续交易ID(含字母数字格式)
识别连续交易ID并提取分组数据
针对交易ID存在纯数字、字母数字混合两种格式的情况,可通过以下步骤按供应商筛选出交易ID连续出现X次的分组数据:
核心思路
- 拆分交易ID为字母前缀和数字主体,统一提取可用于判断连续性的数字部分;
- 按供应商分组,验证分组内数字序列是否连续(相邻数字差为1)且长度达标;
- 提取所有符合条件的分组行数据。
代码实现(R语言)
1. 数据准备与预处理
# 加载字符串处理包(未安装则先执行 install.packages("stringr")) library(stringr) # 导入原始数据并整理列名 df <- read.table(text= "Vendor 'Transaction ID' ACME 1 ACME 2 ACME 3 JDOE A1 JDOE A6 JDOE A10 XYZ B12 XYZ B13 XYZ B14", header=TRUE) colnames(df) <- c("Vendor", "TransactionID")
2. 拆分交易ID的前缀与数字部分
用正则表达式分离两种格式的交易ID,提取可用于判断连续性的数字:
df <- df %>% mutate( # 提取前缀(纯数字交易ID的前缀为空字符串) Prefix = str_extract(TransactionID, "^\\D*"), # 提取数字部分并转为整数 Num = as.integer(str_extract(TransactionID, "\\d+")) )
3. 筛选符合连续条件的供应商分组
设定连续次数阈值X(示例设为3,可按需修改),筛选出满足条件的供应商并提取对应行:
# 设定连续次数阈值 X <- 3 # 筛选符合条件的供应商 valid_vendors <- df %>% group_by(Vendor) %>% arrange(Num) %>% # 按数字排序,确保顺序正确 mutate( # 验证序列是否连续 is_consecutive = all(diff(Num) == 1), # 获取分组内交易数量 group_size = n() ) %>% filter(is_consecutive & group_size >= X) %>% pull(Vendor) %>% unique() # 提取所有符合条件的行(可选择保留或删除临时列) result <- df %>% filter(Vendor %in% valid_vendors) # 输出结果(仅保留原列) print(result %>% select(Vendor, TransactionID))
运行后将输出:
Vendor TransactionID 1 ACME 1 2 ACME 2 3 ACME 3 4 XYZ B12 5 XYZ B13 6 XYZ B14
扩展说明
- 若同一个供应商存在多组不同前缀的连续交易ID(如同时有A1-A3和B5-B7),需按
Vendor + Prefix分组判断,只需将group_by(Vendor)改为group_by(Vendor, Prefix)即可; - 阈值
X可灵活调整,比如要识别连续2次及以上的序列,将X设为2即可。
内容的提问来源于stack exchange,提问作者coult
相关产品推荐
相关产品推荐

