在R中找到两个向量之间的匹配字符串

时间:2016-07-14 10:07:34

标签: r pattern-matching string-matching

我在R中有两个向量。我想找到它们之间的部分匹配。

我的数据

第一个来自名为muc的数据集,其中包含6400个街道名称。 muc $ name看起来像:

muc$name = c("Berberichweg", "Otto-Klemperer-Weg", "Feldmeierbogen" , "Altostraße",...)

另一个向量是d_vector。它包含大约1400个名字。

d_vector = "Abel", "Abendroth", "von Abercron", "Abetz", "Abicht", "Abromeit", ...

我想找到所有街道名称,其中包含街道名称中某处d_vector的名称。

首先,我在导入csv数据(作为变量d)之后进行了一些一般性的修改:

d_vector <- unlist(d$name) d_vector <- as.vector(as.matrix(d_vector))

到目前为止我尝试了什么

  • 然后我尝试用grep找到解决方案,将d_vector转换为包含一个长字符串,用|分隔对于RegEx-Search:

result <- unique(grep(paste(d_vector, collapse="|"), muc$Name, value=TRUE, ignore.case = TRUE)) result

但结果会返回所有街道名称。

  • 我还尝试使用agrep,它重新调整Out of memory - 错误。

  • 当我尝试d_vector %in% muc$name时,它只返回一个TRUE和数百个FALSE,这看起来并不正确。

你有什么建议可以解决我的错误或我可以使用哪个库吗? 我正在寻找像python&#34; fuzzywuzzy&#34;对于R

2 个答案:

答案 0 :(得分:2)

原则上,您的解决方案可以正常处理一些虚拟数据:

d_vector

我认为class(d_vector)的某些内容并不完善。尝试检查dput(d_vector)sapply并将其粘贴到此处。

您也可以尝试使用matches =sapply(patterns, function(p) grep(p, streets, value=TRUE, ignore.case = TRUE)) # $weg # [1] "Berberichweg" "Otto-Klemperer-Weg" # # $platz # [1] "Konrad-Adenauer-Platz" unique(unlist(matches)) # [1] "Berberichweg" "Otto-Klemperer-Weg" "Konrad-Adenauer-Platz" ,看看是否有效:

      <?php
session_start();
include ('db.php');
$db_link=mysqli_connect($hostname, $dbuser, $dbpassword,$dbname) or die("Unable to connect to the server!");
define('FPDF_FONTPATH','../font/');
require('fpdf.php');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',10);
$pdf->Cell(25,7,"answerid");
$pdf->Cell(30,7,"email");
$pdf->Cell(30,7,"qst");
$pdf->Cell(30,7,"answer");
$pdf->Ln();
include ('db.php');
$db_link=mysqli_connect($hostname, $dbuser, $dbpassword,$dbname) or die("Unable to connect to the server!");

        $sql = "SELECT answerid,email,qst,answer FROM responses where email='".$_SESSION['usr_id']."'";
        $result = mysqli_query($db_link,$sql);

        while($rows=mysqli_fetch_array($result))
        {
            $id = $rows['answerid'];
            $email = $rows['email'];
            $question = $rows['qst'];
            $answer = $rows['answer'];
            $pdf->Cell(25,7,$id);
            $pdf->Cell(30,7,$email);
            $pdf->Cell(30,7,$question);
            $pdf->Cell(30,7,$answer);
        }
$pdf->Output();
?>

答案 1 :(得分:2)

简单的解决方案:

streets = c("Berberichweg", "Otto-Klemperer-Weg", "Feldmeierbogen" , "Altostraße")
streets = tolower(streets) #Lowercase all
names = c("Berber", "Weg")
names = tolower(names)

sapply(names, function (y) sapply(streets, function (x) grepl(y, x)))

#                   berber   weg
#berberichweg        TRUE  TRUE
#otto-klemperer-weg  FALSE TRUE
#feldmeierbogen      FALSE FALSE
#altostraße          FALSE FALSE