2017-10-17 4 views
1

Je veux trouver les lettres Captial dans la chaque chaîne et en comptant combien sont là pour chaque chaîne par exempletrouver les lettres Captial dans la chaîne

t = c("gctaggggggatggttactactGtgctatggactac", "gGaagggacggttactaCgTtatggactacT", "gcGaggggattggcttacG") 

ldply(str_match_all(t,"[A-Z]"),length) 

lors de l'application de la fonction ci-dessus ma sortie est

1 4 2 

Mais ma sortie de désir est

[1] G -1

[2] G -1 -1 C T -2

[3] G -2

Répondre

2

Si vous étendez la réponse de docendo être votre exacte format demandé

lapply(stringr::str_extract_all(t, "[A-Z]"), 
     function(x) { 
     x = table(x) 
     paste(names(x), x, sep = "-") 
     }) 

# [[1]] 
# [1] "G-1" 
# 
# [[2]] 
# [1] "C-1" "G-1" "T-2" 
# 
# [[3]] 
# [1] "G-2" 

et comment je le ferais dans tidyverse

library(tidyverse) 
data = data.frame(strings = c("gctaggggggatggttactactGtgctatggactac", "gGaagggacggttactaCgTtatggactacT", "gcGaggggattggcttacG")) 
data %>% 
    mutate(caps_freq = stringr::str_extract_all(strings, "[A-Z]"), 
     caps_freq = map(caps_freq, function(letter) data.frame(table(letter)))) %>% 
    unnest() 
#        strings letters Freq 
# 1 gctaggggggatggttactactGtgctatggactac  G 1 
# 2  gGaagggacggttactaCgTtatggactacT  C 1 
# 3  gGaagggacggttactaCgTtatggactacT  G 1 
# 4  gGaagggacggttactaCgTtatggactacT  T 2 
# 5     gcGaggggattggcttacG  G 2 
+0

Quelle est la différence par rapport à la réponse de @ docendo ?? Je ne le vois pas (autre que de faire un 'coller 'à la fin) - Même réponse imo – Sotos

+0

Parce que c'est la sortie demandée. Comme je l'ai clairement dit, j'ai étendu sa réponse ... – zacdav

+0

La bonne chose à faire était de commenter sous sa réponse qu'une étape supplémentaire peut être ajoutée pour accueillir la partie collage. Re-poster la même réponse juste pour ajouter une ligne de code sonne un peu comme du plagiat. L'addition 'tidyverse' cependant, fait OK comme une nouvelle réponse (que j'aime aussi mieux sa sortie pour être honnête) – Sotos

5

Vous pouvez extraire toutes les lettres majuscules, puis calculer les fréquences avec la table:

library(stringr) 
lapply(str_extract_all(t, "[A-Z]"), table) 
# [[1]] 
# 
# G 
# 1 
# 
# [[2]] 
# 
# C G T 
# 1 1 2 
# 
# [[3]] 
# 
# G 
# 2