在R中从直方图获取频率值

49

我知道如何绘制直方图或其他频率/百分比相关的表格。但现在我想知道,如何获得那些频率值并以表格形式使用。

我有一个庞大的数据集,现在我用一个固定的 binwidth 绘制了直方图。我想提取与每个 binwidth 对应的频率值(即 y 轴上的值),并将其保存在某个地方。

可以有人帮助我吗? 谢谢!

3个回答

58

hist函数有一个返回值(一个histogram类的对象):

R> res <- hist(rnorm(100))
R> res
$breaks
[1] -4 -3 -2 -1  0  1  2  3  4

$counts
[1]  1  2 17 27 34 16  2  1

$intensities
[1] 0.01 0.02 0.17 0.27 0.34 0.16 0.02 0.01

$density
[1] 0.01 0.02 0.17 0.27 0.34 0.16 0.02 0.01

$mids
[1] -3.5 -2.5 -1.5 -0.5  0.5  1.5  2.5  3.5

$xname
[1] "rnorm(100)"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

啊,我也想发这个点子!你跑得比我快 :-) - Tomas
8
请注意,他应该使用 plot = FALSE 参数,这样只会得到结果而不会绘制直方图。 - Tomas
1
有没有不用 hist 的方法? 我试图使用自定义断点创建 hist,但它不起作用。可能还有其他问题吗? - xealits
2
@xealits:table(cut(rnorm(100), breaks=c(-Inf, -1, 1, Inf))) - rcs

23

?hist

一个类为“histogram”的对象,它是由以下组件构成的列表:

  • breaks n+1 个单元格边界(如果这是一个向量,则为 breaks)。 这些是名义上的断点,而不是带有模糊的边界。
  • counts n 个整数;对于每个单元格,x[] 中包含的数量。
  • densityf^(x[i]) ,作为估计的密度值。如果 所有的 diff(breaks) == 1,则它们是相对频率counts/n, 并且一般满足 sum[i; f^(x[i]) (b[i+1]-b[i])] = 1,其中 b[i] = breaks[i]
  • intensitiesdensity相同。已弃用,但保留了兼容性。
  • mids n 个单元格中点。
  • xname 一个字符串,其中包含实际的 x 参数名称。
  • equidist 逻辑值,指示断点之间的距离是否都相同。

breaksdensity几乎提供了您所需的所有内容:

histrv<-hist(x)
histrv$breaks
histrv$density

14

提醒一下,如果有人在想到 ggplotgeom_histogram 时遇到这个问题,注意可以从 ggplot 对象中提取数据。

下面的便利函数输出一个数据框,其中包含每个 bin 的下限(xmin)、上限(xmax)、中点(x)以及频率值(y)。

## Convenience function
get_hist <- function(p) {
    d <- ggplot_build(p)$data[[1]]
    data.frame(x = d$x, xmin = d$xmin, xmax = d$xmax, y = d$y)
}

# make a dataframe for ggplot
set.seed(1)
x = runif(100, 0, 10)
y = cumsum(x)
df <- data.frame(x = sort(x), y = y)

# make geom_histogram 
p <- ggplot(data = df, aes(x = x)) + 
    geom_histogram(aes(y = cumsum(..count..)), binwidth = 1, boundary = 0,
                color = "black", fill = "white")

说明:

hist = get_hist(p)
head(hist$x)
## [1] 0.5 1.5 2.5 3.5 4.5 5.5
head(hist$y)
## [1]  7 13 24 38 52 57
head(hist$xmax)
## [1] 1 2 3 4 5 6
head(hist$xmin)
## [1] 0 1 2 3 4 5

我在这里回答了一个相关问题(使用ggplot2绘制累积直方图)。


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