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

时间:2017-12-18 23:52:48

标签: arrays r regex string extraction

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

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

我已经尝试了以下内容," a4"是一组文本(chr-object)和" t"是大字符对象:

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

然而,在操作之后,对象&#34;匹配&#34;只包含10&#34; NA&#34; -elements,尽管在某些文本中肯定有一些匹配的字符串。

||的 EDIT2:

这是一个可重现的例子,我试图用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 

如果有人想要尝试我正在做的事情,我已将实际数据上传到Dropbox文件夹: 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 END ||

我是否需要以正则表达式模式包装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}

但不知何故&#34;结果&#34;也只包含10&#34; NA&#34;执行后的元素。

1 个答案:

答案 0 :(得分:1)

除了对代码进行其他可能的更改之外,它没有按预期执行,因为您每次都在覆盖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"