Использование 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
      }

    }

  }

}

0 ответов

Другие вопросы по тегам