2017-07-14 49 views
0

我需要根據單獨的源列表來計算列表中單詞或單詞短語的出現頻率。
我有一個作者和研究領域的數據框架。每位作者都有一個或多個與他們的姓名相關的研究領域(單詞/單詞短語)的列表。
有時候同一個研究領域會不止一次出現,我希望他們每次都計算一次(即不是唯一的列表)。
我需要計算作者研究領域與研究領域集合列表中的研究領域相匹配的次數。
我可以在每個作者的基礎上完成,但不能完成整個作者列表。
(實際上,有4組列表,分爲研究類別:生命科學,社會科學等,我需要從每個研究類別的每位作者的研究領域出發,即有多少生命科學領域在他們的名單,社會科學領域有多少人在他們的名單等 一個簡單的例子下面是一個研究範疇,但在現實的例子有4個獨立且唯一的「詞典」。根據R中的第二個列表在一個列表中總結單詞頻率

test.small <- data.frame(AuthorID=c("Mavis", "Cleotha", "Yvonne"), 
        RA=c("Fisheries, Fisheries, Geography, Marine Biology", "Fisheries", 
          "Marine Biology, Marine Biology, Fisheries, Zoology")) 
RA.text <- as.character(test.small$RA) 
RA.list <- strsplit(RA.text, ", ", perl=TRUE) 
lexicon <- c("Fisheries", "Marine Biology") 

sum(RA.list[[3]] %in% lexicon) 

我如何對整個列表執行此操作,將每個作者的總髮生次數分別加總
,並將該數值和存儲在可用於其他計算的向量中?

+2

請不要用那個巨大的字體寫一切 – digEmAll

+1

對不起,digEmAll!不是故意的。看起來像阿蒙克可能已經修復了我 - 謝謝! –

+0

@TessaFrancis這就是和尚存在的原因。 – amonk

回答

1

您可以創建一個函數,並使用lapply將該函數應用於所有行。對我來說,以下的作品,如果我理解正確你的問題:

test.small <- data.frame(AuthorID=c("Mavis", "Cleotha", "Yvonne"), 
         RA=c("Fisheries, Fisheries, Geography, Marine Biology", "Fisheries", 
           "Marine Biology, Marine Biology, Fisheries, Zoology")) 

frequency_counter <- function(x,lexicon) 
{ 
x<- as.character(x) 
RA.list <- strsplit(x, ", ", perl=TRUE) 
count = sum(RA.list[[1]] %in% lexicon) 
return(count) 
} 

# apply the function 
lexicon <- c("Fisheries", "Marine Biology") 
test.small$count = lapply(test.small$RA,function(x) frequency_counter(x,lexicon)) 
1

我們可以使用str_countstringr包。在以下示例中,test.small2是一個數據框,其中列Count顯示了字數。

請注意,我在創建test.small時添加了stringsAsFactors = FALSE,以確保所有列都是字符型的,而不是因素。

or1是來自rebus包的函數,它創建正則表達式語法|

通過使用str_count,我們可能不需要strsplit這個字符串。

# Create example data frame 
test.small <- data.frame(AuthorID=c("Mavis", "Cleotha", "Yvonne"), 
         RA=c("Fisheries, Fisheries, Geography, Marine Biology", "Fisheries", 
           "Marine Biology, Marine Biology, Fisheries, Zoology"), 
         stringsAsFactors = FALSE) 

# Load packages 
library(dplyr) 
library(stringr) 
library(rebus) 

# Define the lexicon 
lexicon <- c("Fisheries", "Marine Biology") 

# Create a new column showing the total number of words matching the lexicon 
test.small2 <- test.small %>% mutate(Count = str_count(RA, or1(lexicon))) 
相關問題