2016-06-15 2 views
2

J'essaye de créer une fonction qui renverra des comptes de nucléotides adjacents spécifiques (CG côte à côte) dans une fenêtre spécifique que j'ai formatée dans un vecteur.Recherche d'entrées vectorielles spécifiques dans une fenêtre coulissante

Je voudrais que les fenêtres pour être de 100 nucléotides de long et déplacer tous les déplacement 10.

Les données est configuré comme celui-ci (à 10k entrées):

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

Jusqu'à présent, je l'ai essayé ceci:

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

Mais je reçois toujours l'erreur

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

J'ai aussi essayé:

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

Cependant, je ne sais pas comment enregistrer les données renvoyées. Cette approche ne me permet pas non plus de superposer des trames.

+2

'(données, WordSize = 2)' est pas une fonction. Vous avez besoin de 'FUN = fonction (x) count (x, wordsize = 2)' probablement. Ou peut-être même '..., FUN = count, wordsize = 2)' pour votre appel 'rollapply'. – thelatemail

+0

Vous voulez pour la ligne 1: 100, 101: 200, etc. le nombre de paires "cg"? –

Répondre

0

EDIT: Pour obtenir la sortie désirée avec une fenêtre glissante d'observation 10, vous pouvez utiliser une boucle for. Puisque nous pré-allouer la taille de notre vecteur de résultat, la boucle est raisonnablement rapide. Je pense que c'est la meilleure façon de résoudre votre problème puisque je ne pense pas que beaucoup de groupement (le cas échéant) supporte une fenêtre coulissante: Nombre

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

Je voulais réellement compter 1: 100, 11: 110, 21: 120 etc –

+0

Je viens d'éditer ma réponse par votre sortie désirée. –

0

Votre méthode ne se chevauche pas, comme vous l'appelez avec by = 100. Sinon, ça a l'air bien. Modifiez-le à 10.

Pour extraire les données de votre dernière tentative, essayez de créer un vecteur de caractères qui recueillera les données, puis vous pourrez extraire le nombre correct avec l'indexation des noms.

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"]) 
}