2013-11-07 7 views
14

Если у меня есть вектор (например, v<-runif(1000)), я могу построить его гистограмму (которая будет выглядеть более или менее как горизонтальная линия, потому что v является образцом из равномерного распределения).Создайте гистограмму для взвешенных значений

Однако предположим, что у меня есть вектор и связанные с ним веса (например, w<-seq(1,1000) в дополнение к v<-sort(runif(1000))). Например, это результат table() на гораздо большем наборе данных.

Как построить новую гистограмму? (в этом примере он должен выглядеть не так, как линия y=x).

Я думаю, я мог бы изменить эффекты table с помощью rep (hist(rep(v,w))), но это «решение» кажется уродливым и ресурс тяжелых (создает промежуточный вектор размера sum(w)), и он поддерживает только целые веса.

+3

Вы можете добавить 'weight' эстетического отображения в' ggplot' используйте 'geom_histogram' –

+0

@JakeBurkhead я не знаю, что! Не могли бы вы добавить это как ответ? –

+0

Вы также можете «заговорить» таблицу. Однако результат - не совсем гистограмма. – BenBarnes

ответ

12

Package plotrix имеет функцию weighted.hist, которая делает то, что вы хотите:

w<-seq(1,1000) 
v<-sort(runif(1000)) 
weighted.hist(v, w) 

Example of <code>weighted.hist</code>

+1

Просто fyi, ссылка мертва. Вот информация о пакете http://cran.r-project.org/web/packages/plotrix/index.html –

+0

@Adam_G Спасибо! Обновлена ​​ссылка в ответе. –

+0

Функция прослушивается: когда я пытаюсь добавить к ней кривую, она не отображает ее в нужном месте ... Попробуйте, например, «weighted.hist (rnorm (T), rep (1, T)/T, col = "wheat"), кривая (dnorm (x), add = TRUE) ' –

22
library(ggplot2) 
w <- seq(1,1000) 
v <- sort(runif(1000)) 

foo <- data.frame(v, w) 

ggplot(foo, aes(v, weight = w)) + geom_histogram() 

enter image description here

3

Альтернативой из weights пакета wtd.hist()

w<-seq(1,1000) v<-sort(runif(1000)) wtd.hist(x=v,weight=w) enter image description here