R stringR RegExp 策略,用于在没有先验知识的情况下对类似表达式进行分组
R stringR RegExp strategy for grouping like expressions without prior knowledge
我有一个 50K+ 部件号的列表。我需要按产品类型对它们进行分组。零件号通常在顺序上彼此接近,尽管它们不是完全连续的。产品描述总是相似的,但不遵循最佳规则。让我用下面的例子来说明 table.
| PartNo | Description | ProductType |
|--------|-------------|-------------|
|A000443 |Water Bottle | Water |
|A000445 |Contain Water| Water |
|A000448 |WaterBotHold | Water |
|HRZ55 |Hershey_Bar | Energy Bar |
|RRB55 |Candy Energy | Energy Bar |
|QMU55 |Bar Protein | Energy Bar |
我事先不知道产品类型。 stringR 正则表达式必须足够智能才能根据零件描述生成产品类型。我是一名刚刚通过 R for Data Science 的新手,这似乎是可以实现的,尽管很困难。
你会如何开始这个问题?我实际使用的内容如下所示。期望我的 stringR 语法将填充 ProductType 列。
| PartNo | Description | ProductType |
|--------|-------------|-------------|
|A000443 |Water Bottle | |
|A000445 |Contain Water| |
|A000448 |WaterBotHold | |
|HRZ55 |Hershey_Bar | |
|RRB55 |Candy Energy | |
|QMU55 |Bar Protein | |
这是让球滚动的可重现示例。
library(tidyverse)
library(stringr)
df <- tribble(
~PartNo, ~Description, ~ProductType,
"A000443", "Water Bottle", "",
"A000445", "Contain Water", "",
"A000448", "WaterBotHold", "",
"HRZ55", "Hershey_Bar", "",
"RRB55", "Candy Energy", "",
"QMU55", "Bar Protein", ""
)
你可以试试stringr::str_extract
。它适用于由 |
.
分隔的多个单词
更新:
OP 建议查找为 ProductType
的词是未知的,应根据 Description
列中不同词的频率来决定这些词。
一个选项是使用 qdap
包来查找不同单词的频率和 select 顶部 n
(比如说 2)个单词,这将决定产品类型。解决方案如下:
library(stringr)
library(qdap)
#Find frequencies of different words
freq <- freq_terms(df$Description)
#Select top `n`. I have taken top 2 and create regex pattern
word_to_search <- paste0(freq$WORD[1:2],collapse = "|")
df$ProductType <- str_extract(tolower(df$Description), word_to_search)
df
# PartNo Description ProductType
# 1 A000443 Water Bottle water
# 2 A000445 Contain Water water
# 3 A000448 WaterBotHold water
# 4 HRZ55 Hershey_Bar bar
# 5 RRB55 Candy Energy <NA> #Didn't match with Water/Bar
# 6 QMU55 Bar Protein bar
数据:
df <- read.table(text =
"PartNo Description
A000443 'Water Bottle'
A000445 'Contain Water'
A000448 WaterBotHold
HRZ55 Hershey_Bar
RRB55 'Candy Energy'
QMU55 'Bar Protein'",
stringsAsFactors = FALSE, header = TRUE)
我有一个 50K+ 部件号的列表。我需要按产品类型对它们进行分组。零件号通常在顺序上彼此接近,尽管它们不是完全连续的。产品描述总是相似的,但不遵循最佳规则。让我用下面的例子来说明 table.
| PartNo | Description | ProductType |
|--------|-------------|-------------|
|A000443 |Water Bottle | Water |
|A000445 |Contain Water| Water |
|A000448 |WaterBotHold | Water |
|HRZ55 |Hershey_Bar | Energy Bar |
|RRB55 |Candy Energy | Energy Bar |
|QMU55 |Bar Protein | Energy Bar |
我事先不知道产品类型。 stringR 正则表达式必须足够智能才能根据零件描述生成产品类型。我是一名刚刚通过 R for Data Science 的新手,这似乎是可以实现的,尽管很困难。
你会如何开始这个问题?我实际使用的内容如下所示。期望我的 stringR 语法将填充 ProductType 列。
| PartNo | Description | ProductType |
|--------|-------------|-------------|
|A000443 |Water Bottle | |
|A000445 |Contain Water| |
|A000448 |WaterBotHold | |
|HRZ55 |Hershey_Bar | |
|RRB55 |Candy Energy | |
|QMU55 |Bar Protein | |
这是让球滚动的可重现示例。
library(tidyverse)
library(stringr)
df <- tribble(
~PartNo, ~Description, ~ProductType,
"A000443", "Water Bottle", "",
"A000445", "Contain Water", "",
"A000448", "WaterBotHold", "",
"HRZ55", "Hershey_Bar", "",
"RRB55", "Candy Energy", "",
"QMU55", "Bar Protein", ""
)
你可以试试stringr::str_extract
。它适用于由 |
.
更新:
OP 建议查找为 ProductType
的词是未知的,应根据 Description
列中不同词的频率来决定这些词。
一个选项是使用 qdap
包来查找不同单词的频率和 select 顶部 n
(比如说 2)个单词,这将决定产品类型。解决方案如下:
library(stringr)
library(qdap)
#Find frequencies of different words
freq <- freq_terms(df$Description)
#Select top `n`. I have taken top 2 and create regex pattern
word_to_search <- paste0(freq$WORD[1:2],collapse = "|")
df$ProductType <- str_extract(tolower(df$Description), word_to_search)
df
# PartNo Description ProductType
# 1 A000443 Water Bottle water
# 2 A000445 Contain Water water
# 3 A000448 WaterBotHold water
# 4 HRZ55 Hershey_Bar bar
# 5 RRB55 Candy Energy <NA> #Didn't match with Water/Bar
# 6 QMU55 Bar Protein bar
数据:
df <- read.table(text =
"PartNo Description
A000443 'Water Bottle'
A000445 'Contain Water'
A000448 WaterBotHold
HRZ55 Hershey_Bar
RRB55 'Candy Energy'
QMU55 'Bar Protein'",
stringsAsFactors = FALSE, header = TRUE)