如何绘制出现n次或多次的术语的直方图?

时间:2014-11-27 19:14:42

标签: r plot histogram

我有一个直接来自文件的单词列表,每行一个,我用read.csv导入,生成data.frame。我需要做的是计算和绘制每个单词的出现次数。那,我可以很容易地做到,但问题是我有几百个单词,其中大多数单词在列表中只出现过一次或两次,所以我对它们不感兴趣。

编辑 https://gist.github.com/anonymous/404a321840936bf15dd2#file-wordlist-csv这是您可以尝试使用的示例词汇表。它与我使用的不一样,我无法分享它,因为它来自实际实验的实际数据,我不允许分享它。出于所有意图和目的,此列表具有可比性。

A"简单"

df <- data.frame(table(words$word))
df[df$Freq > 2, ]

诀窍,我现在有一个出现两次以上的单词列表,以及为什么我必须从data.frame转到数组并返回到data.frame只是一个很难过的问题。要做到这一点,更不用说我必须在实际选择字符串中重复data.frame的名称。完全打败了我。

问题在于,现在过滤后的data.frame对图表无用。假设这是我在过滤后获得的

        Var1 Freq
6     aspect    3
24    colour    7
41    differ   18
55    featur    7
58  function   19
81      look    4
82      make    3
85      mean    7
95   opposit   14
108 properti    3
109   purpos    6
112    relat    3
116   rhythm    4
118    shape    6
120  similar    5
123    sound    3

显然,如果我只是做一个

plot(df[df$Freq > 2, ])

我明白了

显然(显然?)在x轴上具有所有原始项,而y轴仅显示过滤值。所以下一个合乎逻辑的步骤是试图强迫R的手

plot(x=df[df$Freq > 2, ]$Var1, y=df[df$Freq > 2, ]$Freq)

但显然R知道最好并且已经做到了,因为我得到了完全相同的结果。使用ggplot2可以获得更好的效果

qplot(x=df[df$Freq > 2, ]$Var1, y=df[df$Freq > 2, ]$Freq)

(为了保持一致性)但是我希望能够显示一个实际的直方图,你知道,有条形,就像他们在六年级教的那些,所以如果我问那个

qplot(x=df[df$Freq > 2, ]$Var1, y=df[df$Freq > 2, ]$Freq) + geom_bar()

我得到了

Error : Mapping a variable to y and also using stat="bin".
  With stat="bin", it will attempt to set the y value to the count of cases in each group.
  This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
  If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
  If you want y to represent values in the data, use stat="identity".
  See ?geom_bar for examples. (Defunct; last used in version 0.9.2)

所以让我们试试最后的建议,不管吗?

qplot(df[df$Freq > 2, ]$Var1, stat='identity') + geom_bar()

足够公平,但有我的酒吧?所以,回归基础

qplot(words$word) + geom_bar() # even if geom_bar() is probably unnecessary this time

给了我这个

我是疯了还是[替换一长串关于R的ramblings和投诉?]

2 个答案:

答案 0 :(得分:2)

我生成一些随机数据

set.seed(1)
df <- data.frame(Var1 = letters, Freq = sample(1: 8, 26, T))

然后我使用dplyr::filter,因为它非常快速和简单。

library(ggplot2); library(dplyr)
qplot(data = filter(df, Freq > 2), Var1, Freq, geom= "bar", stat = "identity")

答案 1 :(得分:0)

首先,至少使用plot(),没有理由强制使用data.frame。 plot()了解table个对象。你可以做到

plot(table(words$words))
# or 
plot(table(words$words), type="p")
# or 
barplot(table(words$words))

我们可以使用Filter来过滤行,但遗憾的是,它会删除table类。但我们可以使用as.table重新添加。这看起来像

plot(as.table(Filter(function(x) x>2, table(words$words))), type="p")

enter image description here