2017-08-13 2 views
0

J'essaye de créer une boucle qui compte plusieurs motifs dans les rangées d'une trame de données et de rapporter le nombre d'occurrences dans une nouvelle trame de données.Boucler la trame de données pour rechercher plusieurs motifs et les signaler

Voici mon entrée:

input <- data.frame(V1 = LETTERS[1:4], 
      V2 = c("ABCDEF", "AAABBBCCA", "CCAABBCC", "ACCCCCCA"), 
      stringsAsFactors = FALSE) 

Liste des modèles que je veux rechercher:

list<-c("ABC", "AA", "CC", "CCCC", "A") 

Et attendu sortie:

structure(list(V1 = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), V2 = structure(c(2L, 1L, 4L, 3L), .Label = c("AAABBBCCA", 
"ABCDEF", "ACCCCCCA", "CCAABBCC"), class = "factor"), ABC = c(1L, 0L, 0L, 0L), AA = c(0L, 1L, 1L, 0L), CC = 0:3, CCCC = c(0L, 0L, 0L, 1L), A = c(1L, 4L, 2L, 1L), ABC_length = c(1L, 0L, 0L, 0L), AA_length = c(0L, 1L, 1L, 0L), CC_length = structure(1:4, .Label = c("0", "1", "1,1", "2"), class = "factor"), CCCC_length = c(0L, 0L, 0L, 1L), A_length = structure(c(1L, 4L, 3L, 2L), .Label = c("1", "1,1", "2", "3,1"), class = "factor")), .Names = c("V1", "V2",  "ABC", "AA", "CC", "CCCC", "A", "ABC_length", "AA_length", "CC_length",  "CCCC_length", "A_length"), class = "data.frame", row.names = c(NA, -4L)) 

Une solution pourrait utiliser str_count ou str_locate_all, exemple ci-dessous. Mais en réalité, je veux effectuer une recherche en utilisant la liste de motifs mentionnée ci-dessus.

library(stringr) 
input$ABC <- str_count(input$ABC, "ABC") 
input$ABC_length <- lapply(str_locate_all(input$ABC_length, "ABC"), function(x) { 
    paste(x[, 2] - x[, 1] + 1, collapse = ",") 
}) 
+0

juste pour le rendre clair, mon exemple inclut une solution comment trouver un modèle "ABC", mais la question est sur la recherche de plusieurs modèles – user2904120

+1

Vous n'avez pas de solution pour trouver le modèle "ABC" parce que vous êtes se référant à une colonne que vous essayez de créer. – lebelinoz

Répondre

0

Vous êtes sur la bonne voie, mais vous faites référence à la sortie désirée sur le côté droit de votre formule. Au lieu de

input$ABC <- str_count(input$ABC, "ABC") 

(qui n'a pas de sens parce input$ABC n'a pas encore été créée), essayez

input$ABC = str_count(input$V2, "ABC") 

Une logique similaire pour input$ABC_length: vous devez consulter input$V2, non input$ABC_length, sur le bon côté de l'équation.

+0

oui, de cette façon je ne ferais que compter "ABC", puis-je le faire pour toutes les combinaisons dans la liste? – user2904120

+1

La logique est la même: ne pas se référer à la colonne de sortie dans le côté droit de l'équation. – lebelinoz

+0

oui, mais comment faire une boucle qui produirait les données pour chaque modèle dans une trame de données – user2904120