在变量中搜索字符串并返回匹配的字符串
Posted
技术标签:
【中文标题】在变量中搜索字符串并返回匹配的字符串【英文标题】:Search string in variable and return the matched string 【发布时间】:2017-08-03 18:13:48 【问题描述】:我需要一些帮助来将存储在向量中的几个字符串与存储在数据框 (data.table) 的列中的地址进行匹配。我的数据库非常大,大约有 100 万条记录,因此我更喜欢使用 data.table。
下面是数据和向量的虚拟样本 -
my <- data.frame(add=c("50, nutan nagar Mum41","50, nutan Mum88 Maha","77, amar nagar Blr79 Bang","54, veer build Chennai3242","amar 755 Blr 400018"))
vec1 <- c("Mum","Blr","Chennai")
我需要使用我的变量 add 中的每个地址来搜索 vec1 中的每个字符串。如果变量在地址中找到来自 vec1 的任何字符串,它应该在新列 result 中返回匹配的字符串。如果有多个匹配,它应该返回第一个匹配的值,即如果它在一个地址中找到“Mum”和“Blr”,它应该返回“Mum”。
根据虚拟数据,预期结果将是 -
my$result <- c("Mum","Mum","Blr","Chennai","Blr")
我尝试使用 grep / grepl,但他们给出错误“参数‘模式’的长度 > 1,并且只会使用第一个元素”
我尝试使用str_match
,但是对于在地址中找到的向量中的每个字符串,而不是值本身,得到 TRUE / FALSE。
我们怎样才能做到这一点?
【问题讨论】:
【参考方案1】:我们可以使用str_extract
library(stringr)
str_extract(my$add, paste(vec1, collapse="|"))
#[1] "Mum" "Mum" "Blr" "Chennai" "Blr"
或base R
regmatches(my$add, regexpr(paste(vec1, collapse="|"), my$add))
#[1] "Mum" "Mum" "Blr" "Chennai" "Blr"
【讨论】:
比我的解决方案干净得多,不知道这些功能。谢谢你介绍我;) @akrun,太好了!!谢谢!!你做得很简单。 @akrun,该解决方案适用于虚拟数据,但不适用于实际数据。我检查了变量类型并将它们转换为字符,更改了类等,但仍然没有从向量中找到任何文本。在我的实际数据中,文本都是韩文字符,这会是一个问题吗?我们怎么能克服它。从昨晚开始我一直在尝试,但没有运气。两种方法都试过了。请推荐!! @user1412 你能查一下this @akrun,非常感谢。通过浏览该站点上的几个页面,我发现了代码stri_encode(str, from = NULL, to = NULL, to_raw = FALSE)
,它起到了作用。就我而言,我使用了 stri_encode(str, from = "EUC-KR", to = "UTF-8", to_raw = FALSE)
。您的原始代码无需更改粘贴代码即可工作。再次感谢你 akrun :) !!【参考方案2】:
基于 R 的可能解决方案:
vec1[sapply(as.data.frame(do.call(rbind,lapply(vec1,
function(x) grepl(x,my$add)))), function(y) min(which(y)))]
返回:
[1] "Mum" "Mum" "Blr" "Chennai" "Blr"
希望这会有所帮助!
【讨论】:
感谢您的回答!!我需要了解更多关于应用家庭功能的信息。 当我尝试在我的 1m 条记录的实际数据上使用韩文文本实现此代码时,我收到错误“错误其中(y):'which' 的参数不合逻辑”。 ....可能出了什么问题?以上是关于在变量中搜索字符串并返回匹配的字符串的主要内容,如果未能解决你的问题,请参考以下文章