Использование grep/grepl с функцией apply для сопоставления подстрок для каждой строки в столбце
Мне нужна была помощь по использованию grep с функциями apply, чтобы сопоставить все возможные подстроки для каждой строки в столбце. Пример. Допустим, у меня есть файл данных docQ следующим образом:
docQ <- data.frame(QID = c(1,2,3) , QTitle = c("This is a question with objectA objectB objectC",
"This one has stuff like objectAand objectB","Text contains objectC only ") )
Теперь я хочу сопоставить каждый QID с другими QID для максимально возможных присутствующих подстрок. Вероятно, токенизируйте каждое слово и сопоставьте как подстроку с другими QID.
Конечным результатом должен быть список, разбитый на N кадров данных, где N - это n-й QID, например:
docQID`1`
StringMatches WithQID
1 2 2
2 1 3
docQID`2`
StringMatches WithQID
1 2 1
2 1 3
docQID`3`
StringMatches WithQID
1 1 1
2 1 2
РЕДАКТИРОВАТЬ: я пытался с помощью
docQ$match <- apply(docQ,1,function(X) match( tokenize_words(X), tokenize_words(X)))
вместо grep, но не удалось
ОБНОВЛЕНИЕ: я получил решение с уродливым циклом. Это так не похоже на то, что Р. пытается получить что-то лучшее.
doc2 <- data.frame(QTitle = docQ$QTitle)
doc2$Qtoken <- apply(doc2,1,function(X) tokenize_words(X)[[1]])
doc2$Qtoken1 <- apply(doc2,1,function(X) tokenize_words(X$QTitle)[[1]])
doc2$QID <- docQ$QID
doc2$match <- NA
doc2$MaxCount <- NA
maxcnt <- 0
for(i in 1:nrow(doc2)) {
maxcnt <- 0
for(j in 1:nrow(doc2)) {
if (i != j)
{
v1 <- as.vector(doc2$Qtoken[[i]])
v2 <- as.vector(doc2$Qtoken1[[j]])
lenV <- length(table(v1[(v1 %in% v2)]))
if (lenV > maxcnt)
{
maxcnt <- lenV
doc2$match[i] <- j
doc2$MaxCount[i] <- maxcnt
}
}
}
}