计算R中逐个模式的出现次数

时间:2013-07-17 11:22:02

标签: regex r

也许是一个经常被问到的问题,我被困在这里。

从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为我提供了所有事件的行号。

我以为我可以使用库textcnt的{​​{1}}包,但无法让它正常运行。也许它不是正确的包装?

R中是否有一个包/库,它会搜索与该模式匹配的所有单词,并返回每次出现的外观和亚麻布的总数?如果不存在这样的pacakge,任何想法如何使用上述任何一个或更好的方法来做到这一点?

1 个答案:

答案 0 :(得分: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

无论如何,这纯粹是猜测(我消磨时间......)