R: Узнайте, какие наблюдения расположены в каждом «баре» гистограммы

#r #plot #data-visualization #histogram #data-manipulation

Вопрос:

Я работаю с языком программирования R. Предположим, у меня есть следующие данные:

 a = rnorm(1000,10,1)  b = rnorm(200,3,1)  c = rnorm(200,13,1)    d = c(a,b,c) index lt;- 1:1400  my_data = data.frame(index,d)  

Я могу сделать следующие гистограммы тех же данных, отрегулировав длину «ячейки» (с помощью опции «разрывы»).:

 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 lt;- my_data[which(my_data$d lt; 5 amp; my_data$d gt; 0), ] histogram3_bar2 lt;- my_data[which(my_data$d lt; 10 amp; my_data$d gt; 5), ] histogram3_bar3 lt;- my_data[which(my_data$d lt; 15 amp; my_data$d gt; 10), ] histogram3_bar4 lt;- my_data[which(my_data$d lt; 15 amp; my_data$d gt; 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  

Но есть ли более «эффективный» способ сделать это?

Спасибо!

Комментарии:

1. Я верю , что вы хотите cut() , может быть, использовать с split()

2. @ Moody_Mudskipper: спасибо за ваш ответ! Я изучу эту функцию — спасибо!

Ответ №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 сообщите ячейкам, в которых находятся все точки данных.

 h1 lt;- hist(d, breaks = 10) f1 lt;- 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, как видно из индексации d по f1 :

 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 lt;- 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  

Комментарии:

1. @ Руи Бандарас : спасибо за ваш ответ! есть ли способ добавить «минимальный-максимальный диапазон» для каждого из этих сокращений? Спасибо!

2. @stats555 By добавить вы имеете в виду определить их вручную или использовать те hist , которые используются? (Ответ будет » да » и на то, и на другое.)

3. Руи Бандарас: спасибо за ваш ответ! я имел в виду те, которые использовал хист? Спасибо!

4. @stats555 Попробуй minmax lt;- data.frame(min = h1$breaks[f1], max = h1$breaks[f1 1L]);head(minmax) . Отредактируем вопрос с помощью этого.

5. большое вам спасибо за всю вашу помощь!