#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. большое вам спасибо за всю вашу помощь!