如何计算R中的文本行?

时间:2013-03-10 19:44:00

标签: r text count

我想用R来计算不同发言者所说话的行数(这是议会发言记录的成绩单)。基本文本如下:

MR. JOHN: This activity has been going on in Tororo and I took it up with the office of the DPC. He told me that he was not aware of it.
MS. SMITH: Yes, I am aware of that. 
MR. LEHMAN: Therefore, I am seeking your guidance, Madam Speaker, and requesting that you re-assign the duty.  
MR. JOHN: Thank you

在文档中,每个发言者都有一个以MR / MS开头且始终大写的标识符。我想创建一个数据集,该数据集计算每个发言者在文档中说出的每个发言者所说的行数,以便上述文本产生:

MR. JOHN: 2
MS. SMITH: 1
MR. LEHMAN: 2
MR. JOHN: 1

感谢您使用R!

指针

1 个答案:

答案 0 :(得分:10)

您可以使用模式:拆分字符串,然后使用table

table(sapply(strsplit(x, ":"), "[[", 1))
#   MR. JOHN MR. LEHMAN  MS. SMITH 
#          2          1          1 
  

strsplit - 在:分割字符串并生成列表
  用[[ - 选择列表的第一部分元素)来祝福   表 - 获取频率

编辑关注OP的评论。您可以将成绩单保存在文本文件中,并使用readLines来阅读R中的文本。

tt <- readLines("./tmp.txt")

现在,我们必须找到一种模式,通过该模式可以过滤这些文本,只显示那些正在说话的人的名字。我可以根据你在你所链接的成绩单中看到的内容来考虑两种方法。

  • 检查:然后向后看 :以查看它是A-Z还是[:punct:]中的任何一个(即,如果在:之前出现的字符是任何大写字母或任何标点符号 - 这是因为其中一些字符在)之前有:

您可以使用strsplit后跟sapply(如下所示)

使用strsplit:

# filter tt by pattern
tt.f <- tt[grepl("(?<=[A-Z[:punct:]]):", tt, perl = TRUE)]
# Now you should only have the required lines, use the command above:

out <- table(sapply(strsplit(tt.f, ":"), "[[", 1))

还有其他方法可能(使用gsub表示ex :)或替代模式。但这应该让你了解这种方法。如果模式应该不同,那么您应该更改它以捕获所有必需的行。

当然,这假设没有其他行,例如,像这样:

"Mr. Chariman, whatever (bla bla): It is not a problem"

因为我们的模式会为):提供TRUE。如果在文本中发生这种情况,您将不得不找到更好的模式。