Мой набор данных содержит переменные: целочисленный код (INS) и текстовое описание (Beskr).
Я выполнил webscraping, в котором я извлек различные ключевые слова для каждого из 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
}