R语言数据框子集化求助:排除特定后缀值的代码失效
解决反向筛选DataFrame的问题
嗨,我来帮你排查问题!你的反向筛选代码有两个小问题,咱们一步步来修正:
问题1:正则表达式未转义特殊字符
(SP1)和(SP2)里的圆括号是正则表达式的特殊元字符(用于分组),不是普通的文本括号。如果直接写"(SP1)|(SP2)",grepl会把它当成正则分组规则,而不是匹配字符串末尾的(SP1)或(SP2)后缀。
你需要用双反斜杠\\来转义圆括号,告诉grepl这是字面意义的括号,正确的正则应该是:"\\(SP1\\)|\\(SP2\\)"
问题2:subset函数的条件写法错误
你在!grepl(...)外面加了[],这会把grepl返回的逻辑向量转换成索引值,而subset函数的第二个参数只需要直接传入逻辑向量即可,不需要额外的括号包裹。
修正后的代码
# 筛选不含(SP1)/(SP2)后缀的行 Loc.No.End <- subset(location.simple, !grepl("\\(SP1\\)|\\(SP2\\)", Location_Name))
用你的示例数据验证
假设你的示例数据是:
location.simple <- data.frame( Location_Name = c("AMEM01 London", "BANY01 Leeds", "HSBC Dubai (SP1)", "Leeds(SP2)"), City = c("London", "Leeds", "Dubai", "Leeds") )
运行修正后的代码后,Loc.No.End会得到:
| Location_Name | City |
|---|---|
| AMEM01 London | London |
| BANY01 Leeds | Leeds |
完美符合你的需求!
另外,如果你想更精准地匹配结尾的后缀,可以在正则末尾加上$,确保只匹配字符串最后出现的(SP1)或(SP2):
Loc.No.End <- subset(location.simple, !grepl("\\(SP1\\)$|\\(SP2\\)$", Location_Name))
内容的提问来源于stack exchange,提问作者Raul Gonzales
相关产品推荐
相关产品推荐

