从频率表生成R直方图

7

我已经找到了如何将我的数据筛选成频率表的方法 -

        Overall.Cond Freq
235            1    0
236            2    0
237            3    1
238            4    1
239            5    9
240            6    1
241            7    1
242            8    1
243            9    1

我想从这个数据框中绘制一个直方图,但当我执行hist(dataFrameName)时,出现了以下错误。
Error in hist.default(veenker) : 'x' must be numeric

为什么会发生这种情况,如何规避它?
编辑:对于那些建议使用barplot作为解决方案的人(这不是问题),请考虑以下示例,说明为什么barplot不是一个好的解决方案。
这个样本数据
dt = data.frame(vals = c(1.1, 1.2, 1.3, 2.0, 3.4, 26, 35, 45),
                freq = c(  2,   3,   4,   3,   2, 15, 17, 14)) 

使用barplot(dt$freq, names.arg = dt$vals)将生成这个非常误导性的条形图: enter image description here 然而,将数据转换为矢量格式会更有意义,使用以下代码:hist(as.vector(rep(dt$val, dt$freq)))enter image description here

hist 接受“原始”数据并为您计算列联表。不需要将数据钻取到频率表中,只需在您想查看的(列的)数据上使用 hist 即可。 - Hugh
1
令人惊讶的是,关于这个话题的讨论并不多。对于非常大的频率表,当尝试将频率表转换为向量时,很容易耗尽物理内存。想象一下绘制大约阿伏伽德罗数的5个样本。 - geneorama
4个回答

12

你是否真的需要一个直方图或者是条形图?如果坚持要使用直方图,你需要确定最高柱子的上边界;我会假设它是10。

用户user2030503提供的解决方案有些浪费,因为它从频率表中重新创建了数据集。既然你已经计算出了频率表,你可以直接在直方图对象的构建中使用它。后者在R中本质上是一个列表。

Overall.Cond <- 1:10
Freq <- c(0,0,1,1,9,1,1,1,1)
myhist <-list(breaks=Overall.Cond, counts=Freq, density=Freq/diff(Overall.Cond),
              xname="Overall Cond")
class(myhist) <- "histogram"
plot(myhist)

由于条形图的宽度为1,因此在这种情况下密度的计算可以简化;我只是为了通用性而进行说明。


1
OP说他们想要一个直方图而不是条形图(这也是我在寻找答案时想要的)。 - geneorama

3
重新构建您的数据框架:
df= as.data.frame(cbind(Overall.Cond= 1:9, Freq= c(0,0,1,1,9,1,1,1,1)))
df

结果:

  Overall.Cond Freq
1            1    0
2            2    0
3            3    1
4            4    1
5            5    9
6            6    1
7            7    1
8            8    1
9            9    1

然后,制作一组观测向量并将其绘制出来:

df.freq= as.vector(rep(df$Overall.Cond, df$Freq))
hist(df.freq)

enter image description here


我认为条形图仍然更好,因为数字将居中显示在条形下方。 - wordsforthewise
这是最佳答案,因为在大多数情况下,您希望使用 hist 来构建您的箱子。 - geneorama

2

您可以简单地进行以下操作:

myfreq=table(df$columnofinterest)
plot(myfreq)

4
有些效果,但会画线而不是条形。barplot 更适合。 - wordsforthewise

2
我认为应该是一个条形图,代码如下: barplot(dt$Freq, names.arg = dt$Overall.Cond)
其中dt$Freq代表频率,dt$Overall.Cond代表总体条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接