在R中按模式计算单词出现次数

3

这可能是一个经常被问到的问题,我在这里遇到了麻烦。

从一个XML文件中,我正在尝试搜索所有出现次数、它们的行数以及包含仅字母和数字(即字母数字)的12个字符字符串的总出现次数。

例如:如果我的文件是xmlInput,我正在尝试搜索并提取所有12个字符的字母数字字符串的出现次数、位置和总计数。

示例输出:

  String        Total Count     Line-Num
 CPXY180D2324   2               132,846
 CPXY180D2131   1               372
 CPCY180D2139   1               133       

我知道可以使用regmatches通过模式获取字符串的所有出现次数。我一直在使用以下方式进行操作:(感谢您提供的帮助)。

ProNum12<-regmatches(xmlInput, regexpr("([A-Z0-9]{12})", xmlInput))
ProNum12
regmatches可以给我所有符合模式的匹配项,但它不能给出模式出现位置的行号。而grep可以给出所有出现位置的行号。
我曾尝试使用库Tau中的textcnt包,但无法正确运行。也许这不是正确的包?
在R中是否有一个包/库可以搜索所有匹配模式的单词,并返回每个出现次数和行号?如果没有这样的包,任何使用上述方法或更好方法的想法吗?

1
请问您能否编辑一下您的帖子以便格式化其中的代码?同时,使用( )引用 R 命令则更易于阅读。例如:使用 grep` 代替 Grep。 - Arun
编辑过了,现在好一些了吗?谢谢! - BRZ
1
很好,如果您能提供应该产生所示输出的字符串,那就更好了。 - Arun
1个回答

4

没有看到您的数据,很难提供关于如何继续的建议。以下是一些简单的字符字符串示例,可能会帮助您开始找到自己的解决方案。

首先,这是一些示例数据(可能与您的数据完全不同):

x <- c("Some text with a strange CPXY180D2324 string stuck in it.", 
       "Some more text with CPXY180D2131 strange strings CPCY180D2139 stuck in it.", 
       "Even more text with strings that CPXY180D2131 don't make much sense.", 
       "I'm CPXY180D2324 tired CPXY180D2324 of CPXY180D2324 text with CPXY180D2131 strange strings CPCY180D2139 stuck in it.")

我们可以按空格分割它。这可能与你实际的问题不符,但这只是为了帮助你入门(或帮助其他人提供更好的答案,如果情况需要的话)。
x2 <- strsplit(x, " ")

搜索拆分数据以查找与您的正则表达式模式匹配的值。创建一个包含行号和匹配字符串的data.frame
temp <- do.call(rbind, lapply(seq_along(x2), function(y) { 
  data.frame(line = y,
             value = grep("([A-Z0-9]{12})", x2[[y]], 
                          value = TRUE))
}))
temp
#   line        value
# 1    1 CPXY180D2324
# 2    2 CPXY180D2131
# 3    2 CPCY180D2139
# 4    3 CPXY180D2131
# 5    4 CPXY180D2324
# 6    4 CPXY180D2324
# 7    4 CPXY180D2324
# 8    4 CPXY180D2131
# 9    4 CPCY180D2139

创建一个包含行号和计数的数据框(data.frame)。
with(temp, data.frame(
  lines = tapply(line, value, paste, collapse = ", "),
  count = tapply(line, value, length)))
#                   lines count
# CPXY180D2324 1, 4, 4, 4     4
# CPCY180D2139       2, 4     2
# CPXY180D2131    2, 3, 4     3

无论如何,这只是一个猜测(我在打发时间......)。

抱歉回复晚了。我的输入文件是一个xml文件,我对这些字符串有点摸不着头脑。所以,我想出的解决方案非常笨拙和绕弯子。但是它能够工作:我相信你的解决方案比我的regmatches->sqldf->apply更加优雅。我会测试两种方法并进行更改。感谢你的帮助 - simak - BRZ
3
@simak,我听说和朋友一起钓鱼更有趣,所以请随意在你正在使用的XML文件中更新一些内容,并查看其他钓鱼者是否能找到更好的方法。 - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接