首页 > 解决方案 > R中的正则表达式和str_detect()

问题描述

我试图在 str_detect() 中使用正则表达式将一些基本的行业 SIC 代码分类为“更高”分类,但我遇到了一些不同的问题。数据示例如下:

SIC_Code Description
8001     Healthcare (INDUSTRY SEGMENT)
3823     Process Control Instruments
3823     Process Control Instruments
3823     Process Control Instruments
9901     Undefined and Other (INDUSTRY SEGMENT)
2899     Chemical Preparations, Nec

上表有各个 SIC 代码及其说明。然后我要做的是将它们分类到它们的父组,该组由代码的前 2 位数字定义。我有另一个看起来像这样的父组表(请注意,我缩短了表以仅包含此示例中的分组,完整的表可以在这里找到https://www.naics.com/business-lists/counts -by-sic-code/#countsBySIC):

Parent   Description
20       Manufacturing
.
.
.
39       Manufacturing
80       Services
99       Public Administration

我正在尝试使用 str_detect 在 SIC_Code 列的前 2 位中检测父级,然后在原始表中创建一个包含父级描述的新列。因此,例如所有 3 行 3823 和 2899 的行都将被归类为“制造”,而另外两个将被归类为它们各自的父级。

我试过的代码是:

test <- test %>%
  mutate(Parent_Desc = ifelse(str_detect(`SIC_Code`, '^[01-09]'), 'Agriculture, Forestry, and Fishing',
                    ifelse(str_detect(`SIC_Code`, '^[10-14]'), 'Mining',
                    ifelse(str_detect(`SIC_Code`, '^[15-17]'), 'Construction',
                    ifelse(str_detect(`SIC_Code`, '^[20-39]'), 'Manufacturing',
                    ifelse(str_detect(`SIC_Code`, '^[40-49]'), 'Transportation,
                    Communications, Electric, Gas, and Sanitary Services',
                    ifelse(str_detect(`SIC_Code`, '^[50-51]'), 'Wholesale Trade',
                    ifelse(str_detect(`SIC_Code`, '^[52-59]'), 'Retail Trade',
                    ifelse(str_detect(`SIC_Code`, '^[60-67]'), 'Finance,
                    Insurance, and Real Estate',
                    ifelse(str_detect(`SIC_Code`, '^[70-89]'), 'Services',
                    ifelse(str_detect(`SIC_Code`, '^[90-99]'), 'Public Administration',
                    'Other')))))))))))

我有两个不同的问题。当我尝试 ^[01-09] 时,似乎出现了第一个问题。我得到的错误是:

    Error in stri_detect_regex(string, pattern, opts_regex = opts(pattern)) : 
  In a character range [x-y], x is greater than y. (U_REGEX_INVALID_RANGE)

我看到的第二个问题是,如果我尝试 ^[20-39],它会错误地标记某些行。例如,它将 SIC_Code 9901 标记为 TRUE,这意味着它在 20-39 范围内。这显然不是真的。

谁能指出我解决我所看到的问题的方向?我已经尝试使用 SIC_Code 列作为数字和字符,结果是相同的。任何帮助将不胜感激。

标签: rregexstring

解决方案


推荐阅读