我的数据集包含变量:整数代码(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
}
答案 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)