首页 > 解决方案 > 如何计算R中数据框中某个单词的每次出现?

问题描述

以下是我在 R 中的数据框中的条目的一些示例。

我想计算以下单词的每一次出现:疼痛、刺痛、触摸、抓挠、其他(描述)、压力、痒痒、温暖、寒冷。

但是,当我这样做 sum(DF=="Touch") 时,它只计算某人仅输入“触摸”但例如不输入“触摸,压力”的单元格。我如何计算出现“触摸”这个词的每个单元格,无论它是否与另一个词一起出现?任何帮助将不胜感激:),我只是想不通。

标签: rdataframecountunique

解决方案


如果我们想计算一个子字符串单词,然后使用grepl来查找特定的单词模式,通过使用 循环遍历数据集lapplyReduce通过按元素添加 ( +) 并获取sum向量的

sum(Reduce(`+`, lapply(DF, grepl, pattern = "\\bTouch\\b")))
#[1] 5

或者它可以变得紧凑,如果我们将数据更改matrixas.matrix

sum(grepl("\\bTouch\\b", as.matrix(DF)))
#[1] 5

注意:\\b- 指定正则表达式中的单词边界。如果我们没有这些,那么它可能会匹配“Touching”、“Touchy”和“Touch”


它可以包装在一个函数中

f1 <- function(dat, word) {
         pat <- paste0("\\b", word, "\\b")
         count <- sum(Reduce(`+`, lapply(dat, grepl, pattern = pat)))
       return(count)
  }

f1(DF, "Touch")
#[1] 5

这也可以应用于多个单词

sapply(c("Warm", "Touch"), function(x) f1(DF, x))
# Warm Touch 
#    2     5 

数据

DF <- structure(list(Col1 = c("0", "Warm", "Touch", "Tingling", 
     "Touch, Pressure", 
"Pressure"), Col2 = c("Touch", "Warm", "0", "Tingling", "Touch, Pressure", 
"Pressure, Touch")), class = "data.frame", row.names = c(NA, 
-6L))

推荐阅读