2017-08-03 122 views
4

我需要一些帮助来将存储在向量中的少数字符串与存储在数据帧(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") 

我需要在我的变量添加与每个地址搜索每个串的VEC 1。如果变量在地址中找到vec1中的任何字符串,它应该在新列中返回匹配的字符串结果。如果是多次匹配,则它应该返回第一个匹配的值,即Incase,它会在单个地址中找到“Mum”和“Blr”,并返回“Mum”。

基于伪数据,预期的结果将是 -

my$result <- c("Mum","Mum","Blr","Chennai","Blr") 

我试图用grep/grepl但他们给错误“参数‘模式’的长度为> 1且仅第一个元素将被用来“

我尝试使用str_match,但得到TRUE/FALSE在向量中的每个串在地址中发现而不是价值本身。

我们该如何做到这一点?

回答

5

我们可以使用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"  
+2

比我的解决方案更清洁,没有意识到这些功能。感谢您介绍我;) – Florian

+1

@akrun,太棒了!谢谢!!你做得很简单。 – user1412

+0

@akrun,该解决方案适用于虚拟数据,但不适用于实际数据。我已经检查过变量类型并将它们转换为字符,改变了类等,但它仍然没有从矢量中找到任何文本。在我的实际数据文本中都是韩文字符,这会是一个问题吗?我们怎么能过来的。自昨晚以来我一直在尝试,但没有运气。尝试了两种方法。请建议! – user1412

3

与基础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" 

希望这有助于!

+0

谢谢您的回答!我需要更多地了解适用的家庭功能。 – user1412

+0

当我尝试在我的实际数据上使用韩文文本实现这条代码时,我收到错误“错误(其中(y):参数与'哪个'不符合逻辑”)可能是什么出错了? – user1412

相关问题