2015-05-19 11 views
5

EDIT:, że może to być przydatne wspominając dla każdego szukasz później, że dane jest wyjście dostałem od Biomart Kiedy próbowałem atrybuty kolejność wyświetlania.R: Zmiana kolejności konkretnych wierszy danych ramki pojedynczej kolumny do nowej kolumny

Mam następujące dane genomowego:

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)) 

Chciałbym zmienić dane więc pierwsza kolumna pokazuje informacje o gen identyfikatora (np pierwszym przypadku byłoby to: „> ENSRNOG00000001136 | Pebp1”), a następnie linie kodu genomowego pod nim pojawiłyby się razem w kolumnie obok niego. Zauważ, że wiersze 7-10 mają wiele linii kodu genetycznego. Tutaj wszystkie ciągi pod informacją o ID genu będą łączone razem w jedną linię, zamiast rozdzielać na 4 oddzielne rzędy. Wreszcie, chcę również usunąć symbol ">", który pojawia się przed każdym z identyfikatorów genów.

Wynik końcowy będzie zatem wynosić:

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

Należy zauważyć, że jest to tylko kilka pierwszych linii ~ ramki danych 2500 wierszy. Rozwiązanie musi być na tyle ogólne, aby mogło analizować sytuacje, w których liczba wierszy pobranych przez sekwencję może być większa niż 4 wiersze pokazane w powyższym przykładzie.

+0

jest identyfikator zawsze podobnego formatu (tzn jest częścią ENSRNO zawsze taka sama długość, a następnie symbol rury ogranicza go, a następnie jest inna sekcja)? – TARehman

+0

Tak. Identyfikator ma zawsze ten sam format (w rzeczywistości jest to "ENSRNO ** G **") i długość, a następnie symbol rury i nazwa genu. Ten sam format dla wszystkich przypadków. – syntonicC

+0

I nigdy nie będzie przypadkiem, w którym ID zaczyna się w tym samym wierszu, w którym zakończyła się sekwencja genomu, prawda? – TARehman

Odpowiedz

4

Po rzędy etykietowania z tym, czy jest to nazwa genu (na podstawie tego, czy ma ona „>”), można użyć cumsum do określenia grup wierszy. Następnie możesz użyć substr, aby usunąć wiodące ">" i tapply z paste, aby połączyć wszystkie geny w każdej grupie.

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

Oto możliwe data.table rozwiązaniem (chociaż trzeba będzie dodatkowa kolumna o nazwie indx które można usunąć później, jeśli chcesz)

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