我需要根据一个单独的源列表来统计列表中单词或词组出现的频率。
我有一个作者和研究领域的数据框架。每个作者都有一个或更多的研究领域(单词/单词短语)与他们的名字相关联的列表。
有时,同一个研究领域不止一次出现,我希望每次都对它们进行统计(也就是说,不是一个独特的列表)。
我需要统计一位作者的研究领域与一组研究领域中的研究区域相匹配的次数。
我可以在每个作者的基础上做这件事,但不能为所有的作者名单。
(实际上,有4个研究范畴:生命科学、社会科学等),我需要统计每个作者在每个研究类别中的研究领域的发生情况,即它们的列表中有多少生命科学领域,有多少社会科学领域在它们的列表中等等。一个简单的例子在一个研究类别下面,但在实际的例子中有4个单独而独特的“词汇”。
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)如何对整个列表执行此操作,并将每个作者的总发生率分别进行汇总。
把这个数字和存储在一个向量中,我可以用它来做其他计算?
发布于 2017-07-14 12:52:53
您可以创建一个函数,并使用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))发布于 2017-07-14 14:08:43
我们可以从str_count包中使用stringr。在下面的示例中,test.small2是一个数据帧,其列Count显示单词计数。
注意,我在创建stringsAsFactors = FALSE时添加了test.small,以确保所有列都是字符而不是因素。
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)))https://stackoverflow.com/questions/45103352
复制相似问题