2016-01-22 8 views
0

Я новичок в R и боролся с этим. Я хочу создать новый столбец, который проверяет наличие в столбце «текст» набора любых слов («foo», «x», «y»), а затем записывает это значение в новый столбец.R: вырезать и вставлять совпадения ключевых слов

У меня есть кадр данных, который выглядит следующим образом: a->

id  text  time username 
1  "hello x"  10  "me" 
2  "foo and y" 5  "you" 
3  "nothing"  15  "everyone" 
4  "x,y,foo"  0  "know" 

Правильный вывод должен быть:

a2 ->

id  text  time username  keywordtag 
1  "hello x"  10  "me"   x 
2  "foo and y" 5  "you"   foo,y 
3  "nothing"  15  "everyone" 0 
4  "x,y,foo"  0  "know"  x,y,foo 

У меня есть это:

df1 <- data.frame(text = c("hello x", "foo and y", "nothing", "x,y,foo")) 
terms <- c('foo', 'x', 'y') 
df1$keywordtag <- apply(sapply(terms, grepl, df1$text), 1, function(x) paste(terms[x], collapse=',')) 

Какая работа, но сбой R, когда мой список игл содержит 12k слов, а мой текст имеет 155k строк. Есть ли способ сделать это, чтобы не рухнуть R?

+0

Кажется очень неэффективным. Почему бы вам не исследовать пакеты, которые уже рассматривали эту проблему. –

+0

Возможно, попробуйте что-то подобное в библиотеке stringr: sapply (df1, function (x) str_extract_all (x, paste (terms, collapse = "|"))) – Wyldsoul

+0

Что такое 'needleList'? – steveb

ответ

1

Это вариант того, что вы сделали, и что было предложено в комментариях. Это использует dplyr и stringr. Может быть более эффективный способ, но это может не привести к краху вашей сессии R.

library(dplyr) 
library(stringr) 

terms  <- c('foo', 'x', 'y') 
term_regex <- paste0('(', paste(terms, collapse = '|'), ')') 

### Solution: this uses dplyr::mutate and stringr::str_extract_all 
df1 %>% 
    mutate(keywordtag = sapply(str_extract_all(text, term_regex), function(x) paste(x, collapse=','))) 
#  text keywordtag 
#1 hello x   x 
#2 foo and y  foo,y 
#3 nothing   
#4 x,y,foo x,y,foo 
+0

Знаете ли вы, почему dplyr и stringr лучше справляются с этими задачами без сбоев R? – lmcshane

+0

@lmcshane Я не знаю. Также неясно, насколько общие проблемы с сбоем (т. Е. Может быть какая-то другая проблема в вашей среде). – steveb

 Смежные вопросы

  • Нет связанных вопросов^_^