2016-01-13 1 views
1

J'essaie de faire quelque chose de très simple (je pense) mais je n'arrive pas à le contourner. J'essaye d'écrire une boucle qui vérifie si une variable de caractère dans une trame de données contient l'une quelconque d'une certaine liste de sous-chaînes, et pour assigner une valeur correspondante à une variable fictive. Ainsi, imaginez un data.frame, n = 2000, avec une variable data.frame$text. En outre, j'ai un vecteur de caractère contenant toutes les sous-chaînes que je veux texte data.frame$text pour. Appelons-le hillary_exists:R - boucler sur 2 objets

hillary_exists <- c("Hilary Clinton", "hilary clinton","hilaryclinton", "hillaryclinton", "HilaryClinton", 
        "HillaryClinton","Hillary Clinton", "Hillary Rodham Clinton", "Hillary", "Hilary", "#Hillary2016", "#ImWithHer", 
        "Hillary2016", "hillary", "hilary", "Clinton 2016", "Clinton", "Secretary of State Clinton", 
        "Senator Clinton", "Hilary Rodham", "Hilary Rodham Clinton", "Hilary Rodham-Clinton", "Hillary Rodham-Clinton") 

Maintenant, je veux que ma boucle pour tester chaque ligne de data.frame$text l'existence de tous les éléments de hillary_exists, et si l'un d'eux est TRUE, pour générer une nouvelle valeur de 1 pour la variable data.frame$hillary_mention. Voilà ce que j'ai essayé:

for(i in hillary_exists){ 
    if(grepl(hillary_exists[i], data.frame$text)){ 
    data.frame$hillary_mention <- 1 
    } else { 
    data.frame$hillary_mention <- 0 } 
} 

Mais il est évident que je manque le composant i pour l'élément data.frame$text, mais je ne sais pas comment y remédier.

Toute aide serait grandement appréciée! Merci

+0

Salut Avinash, merci pour votre commentaire, pouvez-vous élaborer un peu à ce sujet? Pour autant que je sache, c'est à peu près ce que j'ai fait, n'est-ce pas? – nikUoM

+0

comme ça, 'data.frame $ hillary_mention [i] <- 1' –

+0

Qu'en est-il de' data.frame $ hillary_mention <-sapply (data.frame $ text, fonction (s) any (grepl (s, hillary_exists))) '? –

Répondre

1

Une approche que nous pouvons utiliser pour que cela fonctionne est de transformer hillary_exists en une regex: hillary_regex <- paste(hillary_exists, collapse = "|"). Essentiellement, cela prend simplement tous vos termes et le transforme en une grosse déclaration OR. Cela prend automatiquement en charge l'une des boucles pour nous. Ensuite, il suffit de boucler sur notre colonne de texte, data.frame$text, en utilisant sapply.

data.frame$hillary_mention <- sapply(data.frame$text, function(s) grepl(hillary_regex, s, ignore.case = TRUE)) 

Il est bon d'utiliser ignore.case = TRUE ici parce qu'il peut y avoir des mentions dans le texte qui ne sont pas pris en compte dans hillary_exists, tels que « clinton hillary ».