我需要一些帮助,使用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但不成功
更新:我得到了一个丑陋的for循环解决方案。这与R.试图获得更好的东西不同。
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
}
}
}
}