【问题标题】:Sum word frequency in one list based on a second list in R根据 R 中的第二个列表对一个列表中的词频求和
【发布时间】:2017-07-14 12:45:56
【问题描述】:

我需要根据单独的源列表计算列表中单词或词组的出现频率。
我有一个作者和研究领域的数据框。每位作者都有一个与其姓名相关的 1 个或多个研究领域(单词/词组)的列表。
有时同一个研究领域不止一次出现,我希望每次都对它们进行计数(即,不是唯一的列表)。
我需要计算作者的研究领域与一组研究领域列表中匹配的次数。
我可以按每个作者进行,但不能针对整个作者列表。
(实际上有4个set list,分为研究类别:生命科学、社会科学等,我需要统计每个研究类别中每位作者研究领域的出现次数,即生命科学领域有多少个他们的名单,他们的名单中有多少社会科学领域,等等。 下面是一个研究类别的简单示例,但在实际示例中,有 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)

如何对整个列表执行此操作,分别汇总每个作者的总出现次数
并将该数字总和存储在可用于其他计算的向量中?

【问题讨论】:

  • 请不要用那么大的字体写任何东西
  • 对不起,digEmAll!不是故意的。看起来 amonk 可能已经为我修好了 - 谢谢!
  • @TessaFrancis 这就是 Monk 存在的原因。

标签: r regex list


【解决方案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))

【讨论】:

    【解决方案2】:

    我们可以使用stringr 包中的str_count。在以下示例中,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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-12
      • 2019-04-30
      • 2020-04-08
      • 2015-01-18
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多