2016-01-13 2 views
1

Я пытаюсь сделать что-то довольно простое (я думаю), но я не могу обойти его. Я пытаюсь написать цикл, который проверяет, содержит ли символьная переменная в фрейме данных какой-либо определенный список подстрок и присваивает соответствующее значение фиктивной переменной.R - зацикливание на 2 объекта

так, представьте себе data.frame, n = 2000, с переменной data.frame$text. Кроме того, у меня есть вектор символов, содержащий все подстроки, которые я хочу для текста data.frame$text для. Давайте назовем это hillary_exists:

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

Теперь я хочу, чтобы мой цикл, чтобы проверить каждую строку data.frame$text для существования каждого элемента hillary_exists, и если какой-либо из них TRUE, чтобы генерировать новое значение 1 для переменная data.frame$hillary_mention. Это то, что я пробовал:

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

Но, очевидно, я пропускаю i компонент для data.frame$text элемента, но я не знаю, как решить ее.

Любая помощь была бы принята с благодарностью! Спасибо

+0

Привет, Авинаш, спасибо за ваш комментарий, можете ли вы, возможно, немного поработать над этим? Насколько я могу судить, это в значительной степени то, что я сделал, не так ли? – nikUoM

+0

вот так, 'data.frame $ hillary_mention [i] <- 1' –

+0

Как насчет' data.frame $ hillary_mention <- sapply (data.frame $ text, function (s) any (grepl (s, hillary_exists))) '? –

ответ

1

Один подход, который мы можем использовать, чтобы заставить это работать, - превратить hillary_exists в регулярное выражение: hillary_regex <- paste(hillary_exists, collapse = "|"). По сути, это просто принимает все ваши условия и превращает его в большой оператор OR. Это автоматически берет на себя одну из петель. Затем мы просто перейдем к нашему текстовому столбцу, data.frame$text, используя sapply.

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

Это хорошо использовать ignore.case = TRUE здесь, потому что может быть упоминания в тексте, которые не учитываются в hillary_exists, такие как «Х.Клинтон».