如何在R中解析单列数据,识别含多个真实采购订单的行?
在R中识别含多个采购订单的行
首先,咱们得先明确什么是有效采购订单(PO),从你的示例来看,PO主要有几种典型格式:
- 纯6位数字(比如
123456) - 三段式带连字符的格式(比如
ABC-123-XYZ) - 带
PO#或PO前缀的单个订单(比如PO#124、PO1234A)
而像Row4里的LD6975A更像发货编号,不属于PO范畴。接下来咱们就基于这些特征,一步步实现需求。
步骤1:模拟你的数据
先把示例内容转换成R可处理的数据框:
library(tidyverse) # 创建示例数据 df <- tibble( myvalues = c( "123456 556613 456826", "My PO#124 is the last one", "ABC-123-XYZ DEF-789-JJJ LMQ-529-333", "PO1234A LD6975A SHIPPED" ) )
步骤2:定义有效PO的正则规则
结合示例里的PO格式,我们可以把匹配规则合并成一个正则表达式,用|分隔表示“或”:
# 匹配三种有效PO格式的正则 po_pattern <- "\\b\\d{6}\\b|\\b[A-Z]+-[0-9]+-[A-Z0-9]+\\b|\\bPO#?[A-Z0-9]+\\b"
\\b\\d{6}\\b:匹配独立的6位纯数字PO\\b[A-Z]+-[0-9]+-[A-Z0-9]+\\b:匹配三段式带连字符的PO\\bPO#?[A-Z0-9]+\\b:匹配带PO或PO#前缀的PO
步骤3:统计PO数量并筛选目标行
用stringr::str_count()统计每行的有效PO数量,再筛选出数量≥2的行:
# 统计PO数量并筛选 result <- df %>% mutate(po_count = str_count(myvalues, po_pattern)) %>% filter(po_count >= 2) # 查看结果 result
运行后会得到你想要的行:
# A tibble: 2 × 2 myvalues po_count <chr> <int> 1 123456 556613 456826 3 2 ABC-123-XYZ DEF-789-JJJ LMQ-529-333 3
补充:适配更多PO格式
如果你的实际数据里还有其他PO格式,只需要修改po_pattern里的正则规则就行。比如如果有带P.O.前缀的PO,就把规则扩展成\\bP\\.?O\\.?#?[A-Z0-9]+\\b。
内容的提问来源于stack exchange,提问作者AJAY
相关产品推荐
相关产品推荐

