【问题标题】:R histogram from frequency table频率表中的 R 直方图
【发布时间】:2014-03-14 00:40:20
【问题描述】:

所以我想出了如何将我的数据向下钻取到频率表 -

        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) 会产生这个非常具有误导性的条形图:

但是,使用此代码hist(as.vector(rep(dt$val, dt$freq))) 将数据转换为矢量格式会更有意义:

【问题讨论】:

  • hist 接受“原始”数据并为您制定列联表。无需将数据向下钻取到频率表,只需在要查看的数据(列)上使用 hist
  • 没有更多关于这个话题的讨论是相当令人惊讶的。对于非常大的频率表,在尝试将频率表转换为向量时,很容易耗尽物理内存。想象一下,绘制大约 Avogadro 数的 5 个样本。

标签: r


【解决方案1】:

您真的想要直方图还是条形图?如果您坚持使用直方图,则缺少最顶层 bin 的上边界;我假设它是 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)

由于 bin 宽度为 1,在这种情况下可以简化密度的计算;我只是为了概括起见。

【讨论】:

  • OP 说他们想要一个直方图而不是条形图(这也是我在搜索这个答案时想要的)。
【解决方案2】:

重建你的数据框:

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)

【讨论】:

  • 我认为条形图更好,因为数字将在条形下方居中。
  • 这是最好的答案,因为在大多数情况下,您希望使用 hist 来构建您的垃圾箱。
【解决方案3】:

你可以这样做

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

【讨论】:

  • 一种作品,但画的是线条而不是条形。 barplot 效果更好
【解决方案4】:

我认为应该是条形图,像这样:

barplot(dt$Freq, names.arg = dt$Overall.Cond)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 2018-06-08
    • 2015-07-18
    • 2020-01-27
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多