【问题标题】:R: Find out which observations are located in each "bar" of the histogramR:找出哪些观察值位于直方图的每个“条”中
【发布时间】:2022-01-01 06:57:10
【问题描述】:

我正在使用 R 编程语言。假设我有以下数据:

     a = rnorm(1000,10,1)
     b = rnorm(200,3,1)
     c = rnorm(200,13,1)
    
    d = c(a,b,c)
index <- 1:1400

my_data = data.frame(index,d)

我可以通过调整“bin”长度(通过“breaks”选项)制作相同数据的以下直方图:

hist(my_data, breaks = 10, main = "Histogram #1, Breaks = 10")
 hist(my_data, breaks = 100, main = "Histogram #2, Breaks = 100")
 hist(my_data, breaks = 5, main = "Histogram #3, Breaks = 5")

我的问题:在每个直方图中都有不同数量的“条”(即箱)。例如,在第一个直方图中有 8 个条形图,在第三个直方图中有 4 个条形图。对于这些直方图中的每一个,有没有一种方法可以找出每个条形图中的哪些观察值(来自原始文件“d”)?

现在,我正在尝试手动执行此操作,例如(直方图#3)

histogram3_bar1 <- my_data[which(my_data$d < 5 & my_data$d > 0), ]
histogram3_bar2 <- my_data[which(my_data$d < 10 & my_data$d > 5), ]
histogram3_bar3 <- my_data[which(my_data$d < 15 & my_data$d > 10), ]
histogram3_bar4 <- my_data[which(my_data$d < 15 & my_data$d > 20), ]


head(histogram3_bar1)

    index        d
1001  1001 4.156393
1002  1002 3.358958
1003  1003 1.605904
1004  1004 3.603535
1006  1006 2.943456
1007  1007 1.586542

但是有没有更“有效”的方法来做到这一点?

谢谢!

【问题讨论】:

  • 我相信你想要cut(),也许和split()一起使用
  • @Moody_Mudskipper:谢谢你的回复!我会研究这个功能 - 谢谢!

标签: r plot data-visualization histogram data-manipulation


【解决方案1】:

hist 本身可以为问题的问题提供解决方案,找出哪些数据点在哪些区间内。 hist 返回一个包含第一个成员 breaks 的列表

首先,通过设置 RNG 种子使问题可重现。

set.seed(2021)
a = rnorm(1000,10,1)
b = rnorm(200,3,1)
c = rnorm(200,13,1)
d = c(a,b,c)

现在,保存 hist 的返回值并让 findInterval 告诉 bin 中每个数据点的位置。

h1 <- hist(d, breaks = 10)
f1 <- findInterval(d, h1$breaks)

h1$breaks
# [1] -2  0  2  4  6  8 10 12 14 16

head(f1)
#[1] 6 7 7 7 7 6

前六个观测值是区间 6 和 7,端点分别为 8、10 和 12,可以看出通过 f1d 进行索引:

head(d[f1])
#[1]  8.07743 10.26174 10.26174 10.26174 10.26174  8.07743

至于端点8、10、12给出的区间是左闭还是右闭,见help("findInterval")

作为最后的检查,列出findInterval 返回的值并查看它们是否与直方图的计数匹配。

table(f1)
#f1
#  1   2   3   4   5   6   7   8   9 
#  2  34 130  34  17 478 512 169  24 
h1$counts
#[1]   2  34 130  34  17 478 512 169  24

要获得每个数据点的间隔,如下

bins <- data.frame(bin = f1, min = h1$breaks[f1], max = h1$breaks[f1 + 1L])
head(bins)
#  bin min max
#1   6   8  10
#2   7  10  12
#3   7  10  12
#4   7  10  12
#5   7  10  12
#6   6   8  10

【讨论】:

  • @Rui Bandaras:谢谢你的回答!有没有办法为这些削减中的每一个添加“最小-最大范围”?谢谢!
  • @stats555 添加是指手动定义它们还是使用hist? (答案都是肯定的。)
  • 瑞班德拉斯:谢谢你的回复!我指的是 hist 使用的那些?谢谢!
  • @stats555 试试minmax &lt;- data.frame(min = h1$breaks[f1], max = h1$breaks[f1 + 1L]);head(minmax)。将用这个编辑问题。
  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多