2011-09-07 35 views
6

Soy muy nuevo en R, por lo que esta puede ser una pregunta simple. Tengo una tabla de datos que contiene el conteo de frecuencia de especies como esto:trazando los 5 mejores valores de una tabla en R

Acidobacteria    47 
    Actinobacteria   497 
    Apicomplexa     7 
    Aquificae     16 
    Arthropoda     26 
    Ascomycota    101 
    Bacillariophyta    1 
    Bacteroidetes   50279 
    ... 

Hay alrededor de 50 especies en la tabla. Como puede ver, algunos de los valores son mucho más grandes que los demás. Me gustaría tener una barra de barras apilada con las 5 especies superiores por porcentaje y una categoría de 'otras' que tenga la suma de todos los demás porcentajes. Entonces mi barra de barras tendría un total de 6 categorías (las 5 principales y otras).

Tengo 3 conjuntos de datos adicionales (sitios de muestra) que me gustaría hacer lo mismo para resaltar solo los primeros 5 primeros conjuntos de datos en cada uno de estos conjuntos de datos y ponerlos todos en el mismo gráfico. El gráfico final tendría 4 barras apiladas que muestran cómo cambian las especies superiores en el primer conjunto de datos en cada conjunto de datos adicional.

hice una parcela de muestreo con la mano (tabularon los datos fuera de la I y apenas alimentados en la mesa final de porcentajes) para darle una idea de lo que estoy buscando: http://dl.dropbox.com/u/1938620/phylumSum2.jpg

me gustaría ponga estos pasos en una secuencia de comandos R para que pueda crear estos gráficos para muchos conjuntos de datos.

Gracias!

Respuesta

5

Decir que sus datos están en el hoja.de.datos DF

DF <- read.table(textConnection(
"Acidobacteria    47 
Actinobacteria   497 
Apicomplexa     7 
Aquificae     16 
Arthropoda     26 
Ascomycota    101 
Bacillariophyta    1 
Bacteroidetes   50279"), stringsAsFactors=FALSE) 
names(DF) <- c("Species","Count") 

A continuación, puede determinar qué especies se encuentran en la parte superior 5 por

top5Species <- DF[rev(order(DF$Count)),"Species"][1:5] 

Cada uno de los conjuntos de datos a continuación, se puede convertir en estos 5 y "Otros" por

DF$Group <- ifelse(DF$Species %in% top5Species, DF$Species, "Other") 
DF$Group <- factor(DF$Group, levels=c(top5Species, "Other")) 
DF.summary <- ddply(DF, .(Group), summarise, total=sum(Count)) 
DF.summary$prop <- DF.summary$total/sum(DF.summary$total) 

Haciendo Group un factor Kee vuélvalos a todos en el mismo orden en DF.summary (del más grande al más pequeño según el primer conjunto de datos).

Luego usted simplemente los junta y los traza como lo hizo en su ejemplo.

+0

Hola, gracias por la sugerencia. Traté de hacer una lista de las 5 especies principales como sugirió, pero obtuve el error: Error en DF $ Count: $ operator no es válido para vectores atómicos. Debo mencionar que las especies ya están en una tabla creada con la función table(). – helicase

+0

No sé en qué formato están sus datos; Tenía que crear un conjunto de datos que se parecieran a tus datos, pero muy bien podría tener una estructura diferente. Debería publicar el data.frame que tenga (o el formato en que se encuentre) para que el ejemplo sea reproducible. –

+0

Escribir la tabla en un archivo y volver a leerlo parece haber funcionado. DF.summary me da la tabla que quiero, ¡gracias! Ahora solo tengo que ir a través de los comandos y descubrir qué están haciendo: p – helicase

1

Debemos hacer un hábito de usar data.table siempre que sea posible:

library(data.table) 
DT<-data.table(DF,key="Count") 
DT[order(-rank(Count), Species)[6:nrow(DT)],Species:="Other"] 
DT<-DT[, list(Count=sum(Count),Pcnt=sum(Count)/DT[,sum(Count)]),by="Species"] 
Cuestiones relacionadas