我知道如何绘制直方图或其他频率/百分比相关的表格。但现在我想知道,如何获得那些频率值并以表格形式使用。
我有一个庞大的数据集,现在我用一个固定的 binwidth 绘制了直方图。我想提取与每个 binwidth 对应的频率值(即 y 轴上的值),并将其保存在某个地方。
可以有人帮助我吗? 谢谢!
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"
从?hist
:
一个类为“histogram”的对象,它是由以下组件构成的列表:
breaks
n+1 个单元格边界(如果这是一个向量,则为 breaks)。
这些是名义上的断点,而不是带有模糊的边界。counts
n 个整数;对于每个单元格,x[] 中包含的数量。density
值 f^(x[i])
,作为估计的密度值。如果
所有的 diff(breaks) == 1
,则它们是相对频率counts/n
,
并且一般满足 sum[i; f^(x[i]) (b[i+1]-b[i])] = 1
,其中 b[i] = breaks[i]
。intensities
与density
相同。已弃用,但保留了兼容性。mids
n 个单元格中点。xname
一个字符串,其中包含实际的 x 参数名称。equidist
逻辑值,指示断点之间的距离是否都相同。breaks
和density
几乎提供了您所需的所有内容:
histrv<-hist(x)
histrv$breaks
histrv$density
提醒一下,如果有人在想到 ggplot
的 geom_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绘制累积直方图)。
plot = FALSE
参数,这样只会得到结果而不会绘制直方图。 - Tomastable(cut(rnorm(100), breaks=c(-Inf, -1, 1, Inf)))
- rcs