我有不同的字符串(一个字符串可能包含~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 }
然而,在操作之后,对象“匹配”仅包含10个“NA”元素,尽管在一些文本中肯定存在一些匹配的字符串。
|| Aaditi:
这是一个可重现的例子,我试图用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}
但不知何故,“结果”在执行后也只包含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"