2011-10-12 122 views
29

我知道如何绘制直方图或其他频率/百分比相关的表格。 但是现在我想知道,如何在表格中获得这些频率值以便在事后使用。从直方图中获取频率值R

我有一个海量数据集,现在我绘制了一个带有一组binwidth的直方图。我想提取与每个binwidth对应的频率值(即y轴上的值)并将其保存在某处。

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

回答

18

?hist: 值

类 “直方图”,这是与组件的列表的对象:

  • 休息第n + 1个小区边界(=断裂,如果这是一个向量)。 这些是名义上的中断,而不是边界模糊。
  • 统计n个整数;对于每个单元格,里面的x []的数量。
  • 密度值f ^(x [i])作为估计的密度值。如果 全部(diff(中断)== 1),它们是相对频率计数/ n 并且通常满足和[i; f [(x [i])(b [i + 1] -b [i])] = 1,其中b [i] =中断[i]。
  • 强度与密度相同。已弃用,但保留为 兼容性。
  • 将n个细胞中点定位。
  • xname具有实际x参数名称的字符串。
  • equidist逻辑,指示断点之间的距离是否都是 相同。

breaksdensity提供几乎所有你需要:

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

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" 
+0

Aaaah,刚刚得到了相同的想法,并想发布这个!你的速度更快:-) – TMS

+6

你还应该注意到他应该使用'plot = FALSE',这样他才能得到结果而不绘制直方图。 – TMS

+0

有没有一种方法没有hist? 我想使用自定义休息的hist,它不起作用。还有别的吗? – xealits

2

以防万一有人打考虑到ggplotgeom_histogram这个问题,请注意,有一种方法可以从ggplot对象中提取数据。

以下方便函数输出与每个仓(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 

一个相关的问题我回答了这里(Cumulative histogram with ggplot2)。