使用R函数查找文件中单词的出现次数

时间:2014-02-05 02:50:19

标签: r file grep

我使用以下代码查找文件中单词memory的出现次数,但结果错误。你能帮助我知道我错过了什么吗?

注1:问题是寻找“记忆”一词的确切出现! 注意2:我已经意识到他们正在寻找“记忆”甚至是“记忆”之类的东西是不被接受的!那是我猜想引起混乱的部分。我试了一下“动作”这个词,正确答案是7!你也可以试试。

#names=scan("hamlet.txt", what=character())
names <- scan('http://pastebin.com/raw.php?i=kC9aRvfB', what=character())
Read 28230 items
> length(grep("memory",names))
[1] 9

这是file

2 个答案:

答案 0 :(得分:7)

问题实际上是莎士比亚使用标点符号。文中有很多撇号(')。当R函数scan遇到撇号时,它假定它是引用字符串的开头,并将所有字符读取到下一个撇号到names数组的单个条目中。其中一个长条目恰好包含“memory”一词的两个实例,因此将匹配总数减少一个。

您可以告诉scan将所有引号视为普通字符而不是特别处理它们来解决问题:

names <- scan('http://pastebin.com/raw.php?i=kC9aRvfB', what=character(), quote=NULL )

使用grep的R实现时要小心。它的行为方式与通常的GNU / Linux程序完全不同。特别是,你在这里使用它的方式将找到匹配单词的数量,而不仅仅是一些人建议的匹配行的总数。

答案 1 :(得分:3)

正如@andrew指出的那样,如果一个单词在同一行重复,我之前的答案会给出错误的结果。基于其他答案/评论,这个似乎没问题:

names = scan('http://pastebin.com/raw.php?i=kC9aRvfB', what=character(), quote=NULL )
idxs = grep("memory", names, ignore.case = TRUE)

length(idxs)
# [1] 10