2016-03-24 3 views
0

einen Datenrahmen (dat) mit einer Spaltensequenz aufweist (Seq) (Zeichenklasse). Ich versuche, die Reihenfolge in jeder Zeile aufzuteilen und die Zahlen von 'A', 'C', 'G', 'T' zu zählen und jede Spalte mit mutieren hinzuzufügen (in dplyr). Unten ist mein Beispiel Datenrahmen und Code, den ich versuche.Wie Gesamtzeichen Vorkommen in Datenrahmen zählen, und fügt in Spalte mutiert R unter Verwendung von I

Seq 
CAGGACATAA 
TGTCCACTGC 

Code I auszuführen versuche:

count_bases <- function (x){ 
    for(i in 1:length(x)){ 
     tab[i] <- table(strsplit((x)[i],"")) 
    } 
    return(tab) 
} 
count_bases(dat$Seq) 

Wenn ich für die erste Zeile verwenden Sie einfach den Befehl: table(strsplit(dat$Seq[1],"")) es funktioniert gut und gibt mir das Ergebnis. Gewünschte Ausgabe, die ich versuche zu bekommen, ist durch obige Funktion und mutiert einen Datenrahmen erstellen unten dargestellt:

Seq A C G T 
CAGGACATAA 5 2 2 1 
TGTCCACTGC 1 4 2 3 
+0

So etwas wie 'do.call (rbind, lapply (dat $ Seq, Funktion (x) {table (strsplit (as.character (x), ""))}))'? – alistaire

+1

Was ist mit 'cbind (dat, t (anwenden (dat, 1, Funktion (x) Tabelle (strsplit (x," ")))))? –

+0

Vielen Dank für Ihre Antwort. Ich habe den obigen Code mit "do.call" ausprobiert und bekam diese Warnung "Warnmeldung: In (function (..., deparse.level = 1): Anzahl der Spalten des Ergebnisses ist kein Vielfaches der Vektorlänge (arg 54) "mache ich etwas nicht korrekt? Auch kann diese Funktion aufgerufen werden, um diese Spalten zu bestehenden Datenrahmen (dat) hinzuzufügen. Nochmals vielen Dank – rkg

Antwort

2

Hier ist eine Lösung mit dplyr mit tidyr, die einem beliebigen Anzahl von Sequenzen beliebiger Länge/Zusammensetzung behandeln würde:

library(tidyr) 
library(dplyr) 

dat <- data.frame(Seq = c("CAGGACATAA", "TGTCCACTGC"), 
             stringsAsFactors = F) 

result <- dat %>% 
      # explode each seq into indvidiual 
      # characters on individual rows 
      mutate(seq.split = strsplit(Seq, "")) %>% 
      unnest() %>% 
      # count by each type of character in eah Seq 
      group_by(Seq, seq.split) %>% 
      summarise(n=n()) %>% 
      # convert to wide table format 
      spread(seq.split, n) 

result 
Source: local data frame [2 x 5] 

     Seq  A  C  G  T 
     (chr) (int) (int) (int) (int) 
1 CAGGACATAA  5  2  2  1 
2 TGTCCACTGC  1  4  2  3  
+0

Das ist falsch für mich und beschwert mich über' n() ' – alistaire

0

Es ist irgendwie groß, aber man kann strsplit verwenden zu spalten, und dann lapply über die Ergebnisse eine Liste der Tabellen zu bauen (oder Spaltung innerhalb der lapply Funktion, wohin auch immer Sie bevorzugen). Sie können die Liste dann mit do.call(rbind rekombinieren und sie zum vorhandenen data.frame mit data.frame hinzufügen. Sie müssen as.character verwenden, um alle Faktoren in eine Zeichenfolge zu konvertieren, und factor, um sicherzustellen, dass alle leeren Ebenen von table hinzugefügt werden.

dat <- data.frame(Seq = c("ACGACCGGG", "CAGGACATAA", "TGTCCACTGC")) 

data.frame(dat, do.call(rbind, lapply(strsplit(as.character(dat$Seq), ''), function(x){ 
    table(factor(x, levels = c('A', 'C', 'G', 'T'))) 
}))) 
#   Seq A C G T 
# 1 ACGACCGGG 2 3 4 0 
# 2 CAGGACATAA 5 2 2 1 
# 3 TGTCCACTGC 1 4 2 3 
Verwandte Themen