为缺乏可复制的代码而提前道歉。我有一个名为survey的数据。数据框架中的一个列--调查$Q17--包含多个字符串响应(例如,“缺乏相关技术的高成本”)。我一直在使用grepl
为每个可能的响应创建一个新列,使用grepl(needle, haystack)
命令的变体。
当我试图找到“高成本的实现”的所有实例时,我做了以下违反直觉的发现:
survey$Q17.hcoi <- (
grepl("implementation",
survey$Q17)
)
table(survey$Q17.hcoi == "TRUE")
这将返回27 TRUE。但是,下面的代码..。
survey$Q17.hcoi <- (
grepl("of implementation",
survey$Q17)
)
table(survey$Q17.hcoi == "TRUE")
...returns 26是真的。下面的代码..。
survey$Q17.hcoi <- (
grepl("costs of implementation",
survey$Q17)
)
table(survey$Q17.hcoi == "TRUE")
也返回26真。最后,以下代码..。
survey$Q17.hcoi <- (
grepl("High costs of implementation",
survey$Q17)
)
table(survey$Q17.hcoi == "TRUE")
返回0 TRUE。
这真是令人费解。我认为,grepl
中最长的搜索短语(例如,“执行的高成本”)将优于较短的搜索短语(例如,“实现”)。在这种情况下,事实并非如此。最长的搜索短语返回0 TRUE,而最短的返回27。
有人能解释一下为什么会这样吗?在使用trimws(survey$Q17)
之前,我使用了grepl
删除多余的空白,因为我认为这可能会防止出现一些问题。
发布于 2021-09-04 14:33:24
这是对正则表达式及其工作方式的简单误解,我建议阅读?regex
帮助页面。
当不使用Regex分隔符时,regex匹配整个字符串。“of implementation”将是“匹配包含'of implementation‘的任何字符串”。“实现的高成本”包含该子字符串,而如果您使用的是“高实现成本”,这将查找包含准确的单词序列的任何字符串。因此,这将不匹配字符串‘的实现’,因为它没有‘*高成本*’作为后缀。
如果要匹配包含任何单词的字符串,则可以使用regex或运算符|
。
grepl('High|cost|of|implementation', X)
用向量替换X
。不是说空格“”本身也是一个匹配的字符,所以`* of implementation*‘与'of implementation’不一样!
https://stackoverflow.com/questions/69055973
复制相似问题