2016-04-07 54 views
0

所以我只是建立了基本上需要兩個字符串(一個文本和一組關鍵字)的函數。然後它必須找出文本字符串包含多少關鍵字(如果有的話)。我一直在嘗試將代碼應用於數據幀,但沒有成功。將函數轉換爲應用,sapply(data.frame)

功能工作:

something=function(text,keywords){ 
    kw = unlist(strsplit(keywords, ",")) 
    c=0 
    for(i in length(kw)){ 
    if(grepl(kw[i],text)==0){ 
     c=c+1 
    } else {c} 
    } 
    return(c) 
} 

在哪裏,如果我稱輸入:

> something("this planetarium is the shit","planetarium,amazing") 
[1] 1 

但如果我的數據幀df

 keyword   text_clean 
1 planetarium  Man this planetarium is the shit 
2 musee,africain  rt lyonmangels reste encore places franceangels tour lyon organisons investissons pme 

我的產量預期是什麼:

df.1 
1 1 
2 0 

任何見解?我試着這個代碼:

substng<-function(text, keywords){ 

    vector = laply(text,function(text,keywords){ 
    kw = unlist(strsplit(keywords, ",")) 
    c=0 
    for(i in length(kw)){ 
     if(grepl(kw[i],text)==0){ 
     c=c+1 
     } else {c} 
    } 
    return(c) 
    }) 
    vector.df= as.data.frame(vector) 
} 

df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "keyword   text_clean 
planetarium  'Man this planetarium is the shit' 
musee,africain  'rt lyonmangels reste encore places franceangels tour lyon organisons investissons pme'") 

df$count = substng(df$text_clean,df$keyword) 
+1

'mapply(東西,DF $ text_clean,DF $關鍵字,USE.NAMES = FALSE)'應該工作。雖然我認爲你是'grepl(...)== 0''ing當你應該''grepl(...)== 1''' – rawr

+0

我測試過,'grepl(...)== 0 '0是真的..但你的幫助我解決了我的代碼。我有我的功能運行! 謝謝! –

回答

0

我認爲在stringi包中的stri_count可以實現這一點。

使用「pattern | amazing」作爲模式/正則表達式。管道=「或」。

https://cran.r-project.org/web/packages/stringi/stringi.pdf

+0

好的,謝謝,似乎只會用'grep'替換我的'for'循環,這很好,這是否意味着它會爲整個'df'做? –

+0

如果我正確理解你的問題,是的。從你原來的問題,我想你想要一個整數向量輸出的關鍵字出現在數據框中的每個字符串的次數。 stri_count會給你這個。無論次數如何,grepl都會根據出現在字符串中的任何關鍵字爲您提供邏輯向量。 – mjm