2016-06-15 9 views
2

Ich versuche, eine Funktion zu erstellen, die Zählungen von bestimmten benachbarten Nukleotiden (CG nebeneinander) innerhalb eines bestimmten Fensters zurückgibt, das ich in einem Vektor formatiert habe.Suchen bestimmter Vektoreinträge in einem gleitenden Fenster

würde ich die Fenster wie 100 Nukleotide lang sein und Verschiebung alle 10.

Die Daten sind Setup wie folgt aus (bis 10k Einträge) bewegen:

data <- c("a", "g", "t", "t", "g", "t", "t", "a", "g", "t", "c", "t", 
      "a", "c", "g", "t", "g", "g", "a", "c", "c", "g", "a", "c") 

Bisher habe ich versucht, dies:

library(zoo) 
library(seqinr) 
rollapply(data, width=100, by=10, FUN=count(data, wordsize=2)) 

Aber ich bekomme immer die Fehler

"Error in match.fun(FUN) : 
'count(data, 2)' is not a function, character or symbol" 

Ich habe auch versucht:

starts <- seq(1, length(data)-100, by = 100) 
n <- length(starts) 
for (i in 1:n){ 
    chunk <- data[starts[i]:(starts[i]+99)] 
    chunkCG <- count(chunk,wordsize=2) 
    print (chunkCG) 
} 

Aber ich weiß nicht, wie die Daten zu speichern, die zurückgegeben wird. Dieser Ansatz erlaubt es mir auch nicht, Frames zu überlappen.

+2

COUNT (Daten, Wortgröße = 2) 'ist keine Funktion. Sie brauchen 'FUN = Funktion (x) count (x, wordsize = 2)' wahrscheinlich. Oder vielleicht sogar '..., FUN = count, wordsize = 2)' für deinen 'rollapply' Anruf. – thelatemail

+0

Sie wollen für Zeile 1: 100, 101: 200 usw. die Anzahl der "cg" -Paare? –

Antwort

0

EDIT: Um die gewünschte Ausgabe mit einem 10 Beobachtung Schiebefenster erhalten Sie einen for Schleife verwenden können. Da wir die Größe unseres Ergebnisvektors vorab zuweisen, ist die Schleife ziemlich schnell. Ich denke, dass dies der beste Weg ist, um Ihr Problem zu lösen, da ich denke nicht viel Gruppierung (falls vorhanden) unterstützt ein Schiebefenster:

library(data.table) 
set.seed(1) 
#Sample data 
df<-data.frame(var=sample(c("a","g","t","c"),600,replace=T)) 

#The number of windows you want, shift by 10 each time 
n_windows <- ((nrow(df) - 100)/10) + 1 

#Create empty DF, this helps increase speed of below loop 
res <- data.frame(window=rep(NA,n_windows),count_cg=rep(NA,n_windows)) 

#Loop over each i, paste a leaded version of your sequence onto current sequence and count "cg"s 
for (i in 1:n_windows){ 
     res$window[i] <- paste0((i-1)*10 + 1,"-",(i-1)*10 + 100) 
     subs <- df[((i-1)*10 + 1):((i-1)*10 + 100),"var"] 
     subs2<- paste0(as.character(subs),as.character(shift(subs,1L,type="lead")[1:length(subs) - 1])) 
     res$count_cg[i] <- sum(subs2=="cg") 
} 
    head(res) 
    window count_cg 
1 1-100  10 
2 11-110  10 
3 21-120  8 
4 31-130  9 
5 41-140  9 
6 51-150  9 
+0

Ich wollte eigentlich 1: 100, 11: 110, 21: 120 usw. zählen. –

+0

Ich habe gerade meine Antwort für Ihre gewünschte Ausgabe bearbeitet. –

0

Ihre Methode überlappt nicht, wie Sie es mit by = 100 nennen. Sonst sieht es gut aus. Ändern Sie es einfach in 10.

Um die Daten von Ihrem letzten Versuch zu extrahieren, versuchen Sie, einen Vektor zu erstellen, der die Daten sammelt, und dann können Sie die richtige Anzahl mit Namensindexierung extrahieren.

counted_cg <- vector(mode = "character") 

for (i in 1:n){ 
    chunk <- data[starts[i]:(starts[i]+99)] 
    chunkCG <- count(chunk,wordsize=2) 
    counted_cg <- c(counted_cg, chunkCG["cg"]) 
}