R:将存储在数组中的字符串与另一个数组的字符串进行匹配

R: Matching Strings stored in an array with strings of another array

我有不同的字符串(一个字符串可能包含 ~1-4 个单词)存储在一个大字符对象(总共 38506 个元素)中,一组 10 个文本存储在一个 chr-Object 中(每个大约 100 个单词)可能包含来自大字符对象的字符串之一。

现在我想从每个字符串的文本集中提取可能的匹配项。

我已经尝试过以下方法,"a4" 是文本集(字符对象),"t" 是大字符对象:

i = 1
 while(i < 38506){
    matches <- str_extract(a4, t[i])
    i <- i +1 }

然而,经过操作,对象"matches"只包含10个"NA"元素,虽然在某些文本中肯定有一些匹配字符串。

|| 编辑2:

这是一个可重现的示例,说明我尝试用 x 表示大字符对象,z 表示文本集

请注意,while 循环目前不会产生如下所示的结果,该示例说明了结果应该是什么样子。

实际生成的对象仅包含 8 个 NA - 元素,因此循环中肯定存在一些错误,str_extract 或 pmax 函数:

> x
[1] "Hey-ho!"              "This is"              "Just some random"    
[4] "text"                 "I am trying to match" "please help"         
[7] "very nice"                   "Thanks"  



z
[1] "My name is Thomas. This is my first project"
[2] "R is a cool tool"  
[3] "Hello, Hi There and Hey-ho!"
[4] "Can you please help me clean this mess?"    
[5] "All the best!" 
[6] "Is there a way to get to London by train?"


i <- 1
while(i < length(x)){
extraction <- str_extract(z, x[i])
resulting <- pmax(resulting, extraction)

i <- i + 1
}



> resulting
[1] "This is" NA   "Hey-ho"   "please help" NA   NA 

如果有人想尝试我正在做的事情,我已经将我的实际数据上传到保管箱文件夹中: https://www.dropbox.com/sh/2y7ogjxk1glddh1/AADrDveQguzChaaXXIeLfmIfa?dl=0

我像这样将文件读入 R:

a4 <- readLines(file.path(".","a4.txt"))

t <- readLines(file.path(".","LargeCharacterObject.txt"))

由于某些格式问题,在尝试匹配字符串之前应进行以下替换:

a4 <- gsub('Ü', 'Ü', a4)
a4 <- gsub('Ü', 'Ü', a4)
a4 <- gsub('Ä', 'Ä', a4)
a4 <- gsub('ß', 'ß', a4)
a4 <- gsub('ä', 'ä', a4)
a4 <- gsub('ü', 'ü', a4)
a4 <- gsub('ö', 'ö', a4)
a4 <- gsub('Ö', 'Ö', a4)

t <- gsub('Ü', 'Ü', t)
t <- gsub('Ä', 'Ä', t)
t <- gsub('ß', 'ß', t)
t <- gsub('ä', 'ä', t)
t <- gsub('ü', 'ü', t)
t <- gsub('ö', 'ö', t)
t <- gsub('Ö', 'Ö', t)
t <- gsub('\', '', t)

EDIT2 结束 ||

我是否需要以某种方式将 t[i] 包装在正则表达式模式中?这甚至可行吗? 还是我使用了错误类型的对象/错误的提取方法?

感谢任何提示或想法。

谢谢

编辑

我之前忘了提到数组的元素应该保持相同的顺序并且还包含没有匹配的元素,所以结果应该是这样的:

[1] "NA" "NA" "a" "NA" "b" "NA"

我已经试过了:

i = 1
while(i < 38506){
 matches <- (str_extract(a4, t[i])
 result <- pmax(matches, result)
 i <- i +1}

但不知何故 "result" 在执行后也只包含 10 "NA" 个元素。

撇开对代码的其他可能更改不谈,它并没有按照您的预期进行,因为您每次都在覆盖 matches 而不是附加到它。

因此,这可能适合您。

i = 1
while(i < 38506){
     matches <- c(matches, str_extract(a4, t[i]))
     i <- i +1
}

为了使用可重现的示例进行演示,这里是对您当前正在做的事情的类比。

matches <- character()
for(l in letters){
    matches <- l
}
matches
# [1] "z"

这是您在此类似示例中应该执行的操作。

matches <- character()
for(l in letters){
    print(l)
    matches <- c(matches, l)
}
matches
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v"
# [23] "w" "x" "y" "z"