2016-01-22 47 views
0

我是R的新手,一直在爲此而苦苦掙扎。我想創建一個新列,檢查列'text'中是否存在任何單詞(「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=',')) 

哪個有效,但當我的needleList包含12k個單詞並且我的文本有155k個行時崩潰R.有沒有辦法做到這一點,不會崩潰R?

+0

看起來效率很低。你爲什麼不研究已經解決這個問題的軟件包。 –

+0

也許在stringr庫中試試這樣的東西:sapply(df1,function(x)str_extract_all(x,paste(terms,collapse =「|」))) – Wyldsoul

+0

'needleList'是什麼? – steveb

回答

1

這是你所做的一切變化,以及評論中提出的內容。這使用dplyrstringr。可能有更有效的方法,但這可能不會導致您的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