2015-05-19 12 views
5

EDIT: Dachte, es könnte nützlich sein zu erwähnen, dass diese Daten die Ausgabe ist, die ich von Biomart bekam, als ich versuchte, Sequenzattribute auszugeben.R: Rearrange bestimmte Reihen von einspaltigen Datenrahmen in neue Spalte

Ich habe folgende genomischen Daten:

structure(list(Sequences = structure(c(2L, 10L, 3L, 8L, 9L, 1L, 
5L, 4L, 6L, 7L), .Label = c(">ENSRNOG00000000902|Hsph1", ">ENSRNOG00000001136|Pebp1", 
">ENSRNOG00000001214|Pfkl", "AGAGAGGCGAGCGGCGGAGAGCGGTGGCAAATACTGAACGCAGTCTCGCAGGGTAAGCCC", 
"GAGCGATTGGGACCTCCCCTTTTGGATTGGTAGCTGAGCGGCAGTGGCGGCGGCTGCGTG", 
"GAGGCATCTTCCCGGCCGGTCGGGAGCAGGAGGAGCACGCAGCGGATCCCAGGCAGAGGC", 
"GGACCGGGCCAGCC", "GGCGGGGACAGGCGACAGCCGCGCGGAACGCAGAGCGGCGGGAGAGGAGCTCGGGCTCCT", 
"GGTCTCTGCTGCCGTC", "GTTTAACTGCACTCGGGACTCGGCGCGCGCGTGTGTCTGTTCTCTCCATCGTC" 
), class = "factor")), .Names = "Sequences", class = "data.frame", row.names = c(NA, 
-10L)) 

Ich möchte die Daten neu angeordnet, so dass die erste Spalte das Gen ID info (zB für den ersten Fall zeigt, es wäre: „> ENSRNOG00000001136 | Pebp1“) und dann erscheinen die Linien des genomischen Codes darunter in der Spalte daneben. Beachten Sie, dass die Zeilen 7-10 mehrere Zeilen mit genetischem Code haben. Hier würden alle Strings unterhalb der Gen-ID-Information zu einer Zeile zusammengefügt anstatt über 4 getrennte Zeilen verteilt. Schließlich möchte ich auch das Symbol ">" entfernen, das vor jeder der Gen-IDs steht.

Die Endausgabe wäre also:

ID       Sequence 
ENSRNOG00000001136|Pebp1 GTTTAACTGCACTCGGGACTCGGCGCGCGCGTGTGTCTGTTCTCTCCATCGTC 
ENSRNOG00000001214|Pfkl GGCGGGGACAGGCGACAGCCGCGCGGAACGCAGAGCGGCGGGAGAGGAGCTCGGGCTCCTGGTCTCTGCTGCCGTC 
ENSRNOG00000000902|Hsph1 GAGCGATTGGGACCTCCCCTTTTGGATTGGTAGCTGAGCGGCAGTGGCGGCGGCTGCGTGAGAGAGGCGAGCGGCGGAGAGCGGTGGCAAATACTGAACGCAGTCTCGCAGGGTAAGCCCGAGGCATCTTCCCGGCCGGTCGGGAGCAGGAGGAGCACGCAGCGGATCCCAGGCAGAGGCGGACCGGGCCAGCC 

zu beachten, dass dies nur die ersten paar Zeilen von ~ 2500 Zeilendatenrahmen ist. Die Lösung muss so allgemein sein, dass sie Situationen analysieren kann, in denen die Anzahl der Zeilen, die von der Sequenz belegt werden, mehr als die vier Zeilen im obigen Beispiel betragen kann.

+0

die Identifikation ist immer von einem ähnlichen Format (dh die ENSRNO Teil immer die gleiche Länge, und dann ein Rohrsymbol begrenzt es, und dann gibt es einen anderen Abschnitt)? – TARehman

+0

Ja. Die ID hat immer das gleiche Format (tatsächlich ist es "ENSRNO ** G **") und die Länge gefolgt vom Pipe-Symbol und dem Gen-Namen. Das gleiche Format für alle Fälle. – syntonicC

+0

Und es wird nie einen Fall geben, in dem die ID in derselben Zeile beginnt, wie eine Genomsequenz endete, richtig? – TARehman

Antwort

4

Nach dem Kennzeichnen von Zeilen mit dem Namen eines Gens (basierend darauf, ob es ">" hat) können Sie cumsum verwenden, um Gruppen der Zeilen zu bestimmen. Dann können Sie substr verwenden, um das führende ">" und tapply mit paste zu entfernen, um alle Gene in jeder Gruppe zu kombinieren.

dat$Sequences <- as.character(dat$Sequences) 
(is.gene <- grepl(">", dat$Sequences)) 
# [1] TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE 
(gene.groups <- cumsum(is.gene)) 
# [1] 1 1 2 2 2 3 3 3 3 3 
data.frame(ID=substr(dat$Sequences[is.gene], 2, nchar(dat$Sequences[is.gene])), 
      Sequence=tapply(dat$Sequences[!is.gene], gene.groups[!is.gene], paste, collapse="")) 
#       ID 
# 1 ENSRNOG00000001136|Pebp1 
# 2 ENSRNOG00000001214|Pfkl 
# 3 ENSRNOG00000000902|Hsph1 
#                                                Sequence 
# 1                                    GTTTAACTGCACTCGGGACTCGGCGCGCGCGTGTGTCTGTTCTCTCCATCGTC 
# 2                              GGCGGGGACAGGCGACAGCCGCGCGGAACGCAGAGCGGCGGGAGAGGAGCTCGGGCTCCTGGTCTCTGCTGCCGTC 
# 3 GAGCGATTGGGACCTCCCCTTTTGGATTGGTAGCTGAGCGGCAGTGGCGGCGGCTGCGTGAGAGAGGCGAGCGGCGGAGAGCGGTGGCAAATACTGAACGCAGTCTCGCAGGGTAAGCCCGAGGCATCTTCCCGGCCGGTCGGGAGCAGGAGGAGCACGCAGCGGATCCCAGGCAGAGGCGGACCGGGCCAGCC 
2

Hier ist eine mögliche data.table Lösung (wenn Sie zusätzliche Spalte indx genannt haben, die Sie später entfernen können, wenn Sie wollen)

library(data.table) 
setDT(df)[, list(
       ID = sub("^>", "", Sequences[1L]), 
       Sequences = paste(Sequences[-1L], collapse = "") 
      ), 
      by = list(indx = cumsum(grepl(">", Sequences)))] 
Verwandte Themen