我有一个用户的数据框架,其中一列包含他们自己报告的位置。因此,报告的一些位置是无意义的,但当将该列与已知位置的其他列匹配时,可能会导致误报。以下是数据帧的示例。
data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL", "Mobile,AL", "ALL OVER"))
有了这些数据,我运行下面的代码来建立与AL
的匹配。
library(stringr)
data$match_ab <- str_extract(data[,2], str_c("AL", collapse = "|"))
这导致Huntsville和Mobile被正确地识别为阳性,但由于字符串中的AL
,ALL OVER
的第三个匹配被错误地识别为匹配。
有没有一种方法可以调整这个脚本,使其检测字符串中的匹配,同时忽略字符串中所需部分附加了字母的字符串?换句话说,当部分字符串的两侧可能有空格或标点符号时,这是否可以检测到AL
,而如果字母表中的字母与字符串相邻,则忽略匹配?
提前谢谢。
如果我理解正确,这对你有用吗:
data$match_ab <- str_extract(data[,2], "\bAL\b")
使用\b
,这是一个边界条件,因此如果后面/前面有一个单词或根据文档:符号\b与单词两边的空字符串匹配
只需对特定位置的匹配进行一点调整:在search_item
之后添加$
,这是一个正则表达式,用于指定:如果仅在字符串末尾,则需要进行匹配。
data$match_ab <- str_extract(data[,2], str_c("AL$", collapse = "|")); data;
X Y match_ab
1 1 <NA>
2 2 Washington, DC <NA>
3 3 Huntsville, AL AL
4 4 Mobile,AL AL
5 5 ALL OVER <NA>
假设AL位于字符串的中间,那么这可能更通用:
data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL,
SOMETHING_AT_THE_END", "Mobile,AL", "ALL OVER")); data;
X Y
1 1
2 2 Washington, DC
3 3 Huntsville, AL, SOMETHING_AT_THE_END
4 4 Mobile,AL
5 5 ALL OVER
data$match_ab <- str_extract(data[,2], str_c("AL(?!L)", collapse = "|")); data;
X Y match_ab
1 1 <NA>
2 2 Washington, DC <NA>
3 3 Huntsville, AL, SOMETHING_AT_THE_END AL
4 4 Mobile,AL AL
5 5 ALL OVER <NA>
其中(?!L)
表示不是!
,后面跟着?
L
。
我们也可以使用stringi
中的stri_extract
library(stringi)
data$match_ab <- stri_extract(data[,2], regex = "\bAL\b")