2012-02-03 15 views
9

que tienen una trama de datos que tiene un formato como el siguiente:¿Cómo puedo crear un histograma a partir de datos agregados en R?

Month  Frequency 
2007-08  2 
2010-11  5 
2011-01  43 
2011-02  52 
2011-03  31 
2011-04  64 
2011-05  73 

me gustaría crear un histograma de estos datos, el uso de contenedores de X (X probablemente será de alrededor de 15, pero los datos reales tiene más de 200 meses), y el uso de los datos de la columna de frecuencia como la frecuencia de cada contenedor del histograma. ¿Cómo puedo lograr esto?

He intentado dos enfoques hasta ahora, con los comandos hist() y barplot(). El problema con hist() es que no parece darme ninguna forma de especificar que quiero usar la columna de frecuencia en los cálculos de frecuencia para el histograma. El problema con barplot() es que no tengo flexibilidad para elegir X bins, y si hay meses omitidos, entonces el gráfico resultante no es realmente un verdadero histograma porque el eje x no es continuo.

La única idea que tengo ahora es ir con el método barplot(), completar los meses faltantes con un valor de 0 para Frecuencia y usar espacio = 0 para eliminar el espacio entre las barras. El problema con eso es que no es particularmente fácil elegir una cantidad arbitraria de contenedores.

Respuesta

4

para conseguir este tipo de flexibilidad, puede que tenga que replicar sus datos. Esta es una manera de hacerlo con rep:

n <- 10 
dat <- data.frame(
    x = sort(sample(1:50, n)), 
    f = sample(1:100, n)) 
dat 

expdat <- dat[rep(1:n, times=dat$f), "x", drop=FALSE] 

Ahora se han replicado sus datos en el hoja.de.datos expdat, que le permite llamar hist con diferente número de contenedores:

par(mfcol=c(1, 2)) 
hist(expdat$x, breaks=50, col="blue", main="50 bins") 
hist(expdat$x, breaks=5, col="blue", main="5 bins") 
par(mfcol=c(1, 1)) 

enter image description here

+1

Cuando hice la pregunta, la simplifiqué demasiado porque olvidé mencionar que mis frecuencias realmente abarcaban entre 1 y 50+ millones en lugar del simple ejemplo que di. Estas frecuencias eran demasiado altas para usar 'rep' en los datos brutos en mi máquina (8 GB de RAM). Convertí estas frecuencias a una escala más pequeña (1 a 100,000) que me dio suficiente de un histograma (es decir, una distribución de probabilidad) para mis propósitos. Sin embargo, me gusta su respuesta en general, y hasta ahora es la única solución que he encontrado que me proporciona un histograma "real". ¡Gracias! –

+0

Si sus frecuencias son demasiado altas, simplemente puede reducir el factor de frecuencia de la siguiente manera: expdat <- dat [rep (1: n, times = dat $ f/1000), "x", drop = FALSE] – Marian

4

echa un vistazo a ggplot2.

si los datos están en un data.frame llamada df:

ggplot(df,aes(x=Month,y=Frequency))+geom_bar(stat='identity') 

o si desea tiempo continuo:

df$Month<-as.POSIXct(paste(df$Month, '01', sep='-'),format='%Y-%m-%d') 
ggplot(df,aes(x=Month,y=Frequency))+geom_bar(stat='identity') 
+0

Cuando intento el segundo ejemplo, obtengo 'Error: variable no continua suministrada a scale_y_continuous' cuando ejecuto el comando ggplot. ¿Algunas ideas? –

+0

Tendría que saber más sobre sus datos. Supongo que su 'Frecuencia' no es numérica. Si recreo sus datos: 'df <-data.frame (Month = c ('2007-08', '2010-11', '2011-01', '2011-02', '2011-03', '2011 -04 ',' 2011-05 '), Frecuencia = c (2,5,43,52,31,64,73)) '. Traza muy bien con esos dos comandos. Compruebe el 'str' de sus datos y asegúrese de que está suministrando una variable continua para y. – Justin

+0

Obtuve el segundo trabajo de ejemplo convirtiendo la columna Mes a un tipo Fecha. Esto está más cerca de lo que quiero, pero idealmente, tendría menos contenedores. Parece que esto está dando una barra (efectivamente un contenedor) para cada fecha individual._Edit_: acabo de ver tu comentario anterior; déjame actualizar mi pregunta para abordar eso. –

3

Sí, rep soluciones perderán demasiada memoria en la mayoría de los casos interesantes/grandes. El paquete CRAN HistogramTools incluye una función eficiente PreBinnedHistogram que crea un objeto de histograma R base directamente de una lista de intervalos y saltos tal como se proporcionó la pregunta original.

+0

Gracias, esto fue realmente útil. La única decepción es que la función solo toma los argumentos 'breaks',' counts' y 'xnames', así que, presumiblemente, cualquier manipulación con otras configuraciones tiene que hacerse más tarde, p. 'plot (myhist, axes = FALSE)' en lugar de establecer 'axes = FALSE' cuando el histograma se construye inicialmente. Si alguien quiere ver cómo se ve la salida, incluí un histograma producido de esta manera en esta respuesta: http://stats.stackexchange.com/a/122853/22228 – Silverfish

0

Otra posibilidad es reducir su variable de frecuencia por un factor grande para que rep no tenga tanto trabajo que hacer. Luego ajuste la escala del eje vertical del histograma por el mismo factor.

Cuestiones relacionadas