我正在处理地址数据并使用正则表达式来检测错误。虽然我的方法有效,但它远非高效。
首先,让我们创建一个数据集。
try_detection <- data.frame(address = c('444+MLK+Street',
'444+3rd+Avenue',
'5th+MLK+Avenue',
'55th+MLK+Avenue',
'555th+MLK+Avenue',
'5555th+MLK+Avenue',
'55555th+MLK+Avenue'),
stringsAsFactors = FALSE)
唯一的前 2 个观察结果是正确的,因为它以地址编号开头。目标是将前 2 个观察值标记为 FALSE,其余为 TRUE。
我可以看到不正确的模式是数字后跟字母。所以,这就是我尝试过的。
方法一
try_detection$summary <- str_detect(try_detection$address, '^[:digit:]{1}[:alpha:]')
结果是只有第 3 次观察被标记。所以,我只是想我可以简单地使用'|' 并替换 {} 中的数字。
方法二
try_detection$summary <- str_detect(try_detection$address,
'^[:digit:]{1}[:alpha:] |
^[:digit:]{2}[:alpha:] |
^[:digit:]{3}[:alpha:] |
^[:digit:]{4}[:alpha:] |
^[:digit:]{5}[:alpha:]')
但是所有观察结果都被标记为 FALSE。
方法三
所以,这就是我最终使用的。
try_detection$detect1 <- str_detect(try_detection$address, '^[:digit:]{1}[:alpha:]')
try_detection$detect2 <- str_detect(try_detection$address, '^[:digit:]{2}[:alpha:]')
try_detection$detect3 <- str_detect(try_detection$address, '^[:digit:]{3}[:alpha:]']
try_detection$detect4 <- str_detect(try_detection$address, '^[:digit:]{4}[:alpha:]')
try_detection$detect5 <- str_detect(try_detection$address, '^[:digit:]{5}[:alpha:]')
try_detection <- try_detection %>% mutate(summary =
ifelse(detect1 == TRUE |
detect2 == TRUE |
detect3 == TRUE |
detect4 == TRUE |
detect5 == TRUE, "Y", "N"))
虽然它可以工作并且可以更正标记不正确的地址,但它根本没有效率。请告知我如何更有效地完成工作。