有没有一种更快的方法来为数据集中的每个观测值计算关键字匹配数

时间:2019-06-13 10:02:10

标签: r string-matching

我的数据集包含变量:整数代码(INS)和文本说明(Beskr)。

我进行了一次网络抓取,其中我为88个不同的代码中的每个提取了不同的关键字。我想计算这些关键字在文本描述中的匹配数,并将计数存储在每个代码的新变量中。

仅使用一些观察,它就可以与嵌套的for循环一起快速运行,但是当我增加数据的大小时,它会花费很长时间。有没有更简便快捷的方法?数据集应包含用于代码,描述的列以及带有关键字匹配计数的88个变量。

#For testing
descriptions <- c("Ska pyssla med bade Fiske och vattenbruk", "fiske", "jordbruk", 
            "tillverkning", "vattenbruk", "motorfordon")
ins <- 1:6

testDFScrape <- as.data.frame(matrix(ncol = 2, nrow =6))
testDFScrape[,1] <- ins
testDFScrape[,2] <- descriptions
colnames(testDFScrape) <- c("INS", "Beskr")

#Add the variable columns for the matches
colAdditions <- paste(rep("NbrOfMatchesWithCode", 3), 1:3, sep = "" )
testDFScrape[colAdditions] <- NA

#Faked keywords, the real data contains 88 groups of keywords.
scrapedTextTokens<- list(keywordscode1 = c("fiske", "jordbruk"), 
                         keywordscode2 = ("tillverkning"), 
                         keywordscode3 = c("motorfordon", "vattenbruk"))

#For each row, Count matches for each of the 88 Groups different keywords

keyMatchCount <- 0
for(rowNbr in 1:nrow(testDFScrape)){  
  for(i in 1:length(scrapedTextTokens)){
    for(keyword in scrapedTextTokens[[i]]){
      if(str_detect(tolower(testDFScrape[rowNbr, 2]), keyword)){
             keyMatchCount <- keyMatchCount + 1} 
    } 
    testDFScrape[rowNbr, i + 2] <- keyMatchCount
    keyMatchCount <- 0
  }
}


编辑:在eastclintw00d的帮助下解决方案

library(dplyr)

for(i in 1:length(scrapedTextTokens)){
  df <- as.data.frame(lapply(scrapedTextTokens[[i]], str_count, string = testDFScrape$Beskr))
  df <- df %>%
    mutate(total = rowSums(.))
  testDFScrape[ ,i + 2] <- df$total
}

1 个答案:

答案 0 :(得分:0)

我将here的解决方案适应了您的问题。它为您提供每个关键字的计数。您只需要汇总关键字组即可。

library(stringr)

lll <- tolower(c("Ska pyssla med bade Fiske och vattenbruk", "fiske", "jordbruk", 
                    "tillverkning", "vattenbruk", "motorfordon"))
dict <- list("fiske", "jordbruk", "tillverkning", "motorfordon", "vattenbruk")

as.data.frame(lapply(dict, str_count, string=lll), col.names = dict)