我想用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!
指针答案 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。如果在文本中发生这种情况,您将不得不找到更好的模式。