使用带有apply函数的grep / grepl来匹配列中每行的子字符串

时间:2017-04-26 05:53:28

标签: r grep lapply sapply grepl

我需要一些帮助,使用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
      }

    }

  }

}

0 个答案:

没有答案