2016-05-27 17 views
1

Ich habe einen data.frame mit mehreren tausend Zeilen. Ich lege mehrere Zeilen Code auf Teilmengen dieser Daten an.Code auf verschiedenen Untergruppen ausführen

Ich habe 4 Teilmengen in einer Spalte "mergeorder $ phylum":

[1] "ascomycota"  "basidiomycota" "unidentified" 
[4] "chytridiomycota" 

Und auf jeder Teilmenge habe ich diesen Satz von Funktionen separat anzuwenden:

ascomycota<-mergeorder[mergeorder$phylum %in% c("ascomycota"), ] 
group_ascomycota <- aggregate(ascomycota[,2:62], by=list(ascomycota$order), FUN=sum) 

row.names(group_ascomycota)<-group_ascomycota[,1] 
group_ascomycota$sum <-apply(group_ascomycota[,-1],1,sum) 

dat5 <-sweep(group_ascomycota[,2:62], 2, colSums(group_ascomycota[2:62]), '/') 
dat5$sum <-apply(group_ascomycota[,-1],1,sum) 
reorder_dat5 <- dat5[order(dat5$sum, decreasing=T),] 

reorder_dat5$OTU_ID <- row.names(reorder_dat5) 
FINITO<-reorder_dat5[1:15,] 

write.table(FINITO, file="output_ITS1/ITS1_ascomycota_order_top15.csv", col.names=TRUE,row.names=FALSE, sep=",", quote=FALSE) 

Dieser Code funktioniert . Allerdings möchte ich diesen Code anwenden, ohne jede "Ascomycota" manuell durch "Basidiomycota", "Unidentified" oder "Chytridiomycota" zu ersetzen.

Welche Funktion soll ich verwenden? Wie soll ich es benutzen? Ich habe mit sapply(), repeat() kämpfen, aber nicht weit gekommen.

Das Endergebnis sollte den gesamten Code ausführen und csv separate Dateien exportieren.

Vielen Dank für Ihre Antwort

Antwort

2

Es ist in der Regel möglich, Code zu schreiben, die alle Untergruppen in einem Rutsch verarbeitet. Was Sie jedoch tun, ist ziemlich kompliziert. Das Beste, was zu tun ist, könnte sein, all das in einer Funktion zusammenzufassen und dann die Funktion für jede Teilmenge auszuführen. Etwas wie folgt aus:

subset_transform <- function(subset){ 
    t <-mergeorder[mergeorder$phylum %in% c(subset), ] 
    group_t <- aggregate(t[,2:62], by=list(t$order), FUN=sum) 

    row.names(group_t)<-group_t[,1] 
    group_t$sum <-apply(group_t[,-1],1,sum) 

    dat5 <-sweep(group_t[,2:62], 2, colSums(group_t[2:62]), '/') 
    dat5$sum <-apply(group_t[,-1],1,sum) 
    reorder_dat5 <- dat5[order(dat5$sum, decreasing=T),] 

    reorder_dat5$OTU_ID <- row.names(reorder_dat5) 
    FINITO<-reorder_dat5[1:15,] 

    write.table(FINITO, file = paste("output_ITS1/ITS1_", subset, "_order_top15.csv"), col.names=TRUE,row.names=FALSE, sep=",", quote=FALSE) 
} 

subset_transform("ascomycota") 
subset_transform("basidiomycota") 
subset_transform("unidentified") 
subset_transform("chytridiomycota") 
+0

Anstatt die subsetting Code innerhalb der Funktion setzen, ist es ziemlich üblich, eine Funktion zu schreiben, die die subsetting getan wurde, geht davon aus, die dann gut funktionieren kann mit 'dplyr :: do' oder' Daten .table' oder sogar 'base :: split' und' lapply'. – Gregor

+0

@Gregor Das wäre eine nette Idee, danke :) Ich habe versucht, es so umzuschreiben, aber es endete ein bisschen peinlich, um den Tisch zu nennen, der geschrieben wurde (soweit ich es irgendwie schaffen konnte). Ich werde es für das nächste Mal im Hinterkopf behalten. –

+0

Ich würde einfach den Namen als 'df [1, 'phylum']' an diesem Punkt ziehen. – Gregor

Verwandte Themen