2011-09-07 18 views
6

Sono molto nuovo a R quindi questa potrebbe essere una semplice domanda. Ho una tabella di dati che contiene i conteggi di frequenza delle specie come questo:tracciare i primi 5 valori da una tabella in R

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

ci sono circa 50 specie del tavolo. Come puoi vedere alcuni valori sono molto più grandi degli altri. Mi piacerebbe avere un barattolo accatastato con le prime 5 specie in percentuale e una categoria di "altro" che abbia la somma di tutte le altre percentuali. Quindi il mio barplot avrebbe 6 categorie in totale (top 5 e altro).

Ho 3 set di dati aggiuntivi (siti di esempio) che mi piacerebbe fare la stessa cosa per evidenziare solo i primi 5 dei primi set di dati in ognuno di questi set di dati e metterli tutti sullo stesso grafico. Il grafico finale avrebbe 4 barre impilate che mostrano come le specie principali nel primo set di dati cambiano in ogni set di dati aggiuntivo.

ho fatto un complotto del campione a mano (tabulati dei dati al di fuori di R e solo alimentato al tavolo finale delle percentuali) per dare un'idea di quello che sto cercando: http://dl.dropbox.com/u/1938620/phylumSum2.jpg

vorrei metti questi passaggi in uno script R in modo da poter creare questi grafici per molti set di dati.

Grazie!

risposta

5

Dite i vostri dati sono in data.frame 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") 

Quindi è possibile determinare quali specie sono nella top 5 da

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

Ognuno dei set di dati possono poi essere convertiti in questi 5 e "Altro" di

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) 

Making Group un fattore kee ps tutti nello stesso ordine in DF.summary (il più grande al più piccolo per il primo set di dati).

Quindi li metti insieme e li piazzano come hai fatto nel tuo esempio.

+0

Ciao, grazie per il suggerimento. Ho provato a creare un elenco delle 5 specie migliori come suggerito ma ho ricevuto l'errore: Errore in DF $ Conteggio: l'operatore $ non è valido per i vettori atomici. Dovrei menzionare che le specie sono già in una tabella creata con la funzione table(). – helicase

+0

Non so in che formato sono i tuoi dati; Ho dovuto creare un set di dati che assomigliasse ai tuoi dati, ma potrebbe benissimo avere una struttura diversa. Dovresti pubblicare il data.frame che hai (o qualunque formato sia) in modo che l'esempio sia riproducibile. –

+0

Scrivere il tavolo su un file e rileggerlo sembra aver funzionato. DF.summary mi da il tavolo che voglio, grazie! Ora devo solo passare attraverso i comandi e capire cosa stanno facendo: p – helicase

1

Noi dovrebbe prendere l'abitudine di utilizzare data.table ove possibile:

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"] 
Problemi correlati