3

我想使用 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 的指针!

4

1 回答 1

10

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

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

strsplit - 拆分字符串:并生成一个列表
sapply 与 [[ - 选择列表的第一部分元素
- 获取频率

编辑:遵循 OP 的评论。您可以将成绩单保存在文本文件中,并用于readLines阅读 R 中的文本。

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

现在,我们必须找到一种模式,通过该模式来过滤此文本,仅针对那些带有发言者姓名的行。根据我在您链接的成绩单中看到的内容,我可以想到两种方法。

  • 检查 a:然后往后看,:看它是否是A-Zor [:punct:](也就是说,如果出现在 the 之前的字符:是任何大写字母或任何标点符号 - 这是因为其中一些在)之前有 a :)。

可以使用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例如使用:)或替代模式。但这应该让您对这种方法有所了解。如果模式应该不同,那么您应该更改它以捕获所有必需的行。

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

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

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

于 2013-03-10T19:47:11.677 回答