【问题标题】:Count occurrences of words in a string according to a category in R根据R中的类别计算字符串中单词的出现次数
【发布时间】:2017-12-18 16:04:15
【问题描述】:

我需要在文本字符串中搜索关键字,然后在 R 数据框中分配一个类别。这会产生一个问题,即我有多个类别的关键字。我想轻松提取代表多个类别的行,以便我可以手动评估它们并分配正确的类别。

为此,我尝试添加一个计数列来显示每个字符串中代表了多少个类别。

使用下面链接的两种解决方案的组合,我已经设法获得了一部分,但我仍然没有得到正确的输出

Partial animal string matching in R

Count occurrences of specific words from a dataframe row in R

我在下面创建了一个示例。我希望应用以下规则:

如果字符串有猫或狮子 wcount 得到 1 - 仅代表 1 个组(猫)

如果字符串有 dog 或 wolf wcount 得到 1 - 仅代表 1 个组(犬)

如果字符串有(猫或狮子)和(狗或狼)wcount 得到 2 - 代表两组(猫和犬)

然后我可以轻松地拉出 wcount > 1 的行

id <- c(1:5)
text <- c('saw a cat',
      'found a dog',
      'saw a cat by a dog',
      'There was a lion',
      'Huge wolf'
      )
dataset <- data.frame(id,text)

SearchGrp<-list(c("(cat|lion)", "feline"),
            c("(dog|wolf)","canine"))

output_vector<- character (nrow(dataset))

for (i in seq_along(SearchGrp)){

output_vector[grepl(x=dataset$text, pattern = SearchGrp[[i]][1],ignore.case = TRUE)]<-SearchGrp[[i]][2]}  

dataset$type<-output_vector


keyword_temp <- unlist(lapply(SearchGrp, function(x) new<-{x[1]}))
keyword<-paste(keyword_temp[1],"|",keyword_temp[2])

library(stringr)
getCount <- function(data,keyword)
 {
  wcount <- str_count(dataset$text, keyword)
  return(data.frame(data,wcount))
   }

getCount(dataset,keyword)

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    这是获取跨类型计数的基本 R 方法。

    dataset$wcnt <- rowSums(sapply(c("dog|wolf", "cat|lion"),
                                   function(x) grepl(x, dataset$text)))
    

    在这里,sapply 遍历每种类型的正则表达式并将其提供给grepl。这将返回一个矩阵,其中的列是逻辑向量,指示是否找到了特定类型(例如,“dog|wolf”)。 rowSums 沿行对逻辑求和以获得类型种类计数。

    返回

    dataset
      id               text wcnt
    1  1          saw a cat    1
    2  2        found a dog    1
    3  3 saw a cat by a dog    2
    4  4   There was a lion    1
    5  5          Huge wolf    1
    

    如果您想要中间步骤,在 data.frame 中将逻辑向量作为变量返回,您可能希望在命名向量中设置值,然后对结果执行 cbind

    # construct named vector
    myTypes <- c("canine"="dog|wolf", "feline"="cat|lion")
    # cbind sapply results of logicals to original data.frame
    dataset <- cbind(dataset, sapply(myTypes, function(x) grepl(x, dataset$text)))
    

    返回

    dataset
      id               text canine feline
    1  1          saw a cat  FALSE   TRUE
    2  2        found a dog   TRUE  FALSE
    3  3 saw a cat by a dog   TRUE   TRUE
    4  4   There was a lion  FALSE   TRUE
    5  5          Huge wolf   TRUE  FALSE
    

    【讨论】:

    • 谢谢你的作品! - 我可以使用我的代码的第一部分进行分类,然后将 SearchGrp 传递给行总和
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2015-09-14
    • 2021-11-17
    • 2021-01-09
    • 2013-02-01
    • 2019-07-31
    相关资源
    最近更新 更多