4

文字列と文字ベクトルがあります。文字列の先頭から可能な限り多くの文字に一致する文字ベクトル内のすべての文字列を検索したいと思います。例えば:

s <- "abs"
vc <- c("ab","bb","abc","acbd","dert")

result <- c("ab","abc")

文字列は、最初の K 文字まで正確に一致する必要があります。可能な限りマッチさせたい (最大 K<=長さ)。ここでは、"abs" に一致するものはありません (grep("abs",vc)) が、"ab" には 2 つの一致があります (result <-grep("ab",vc))。

4

3 に答える 3

2

別の解釈:

s <- "abs"
# Updated vc
vc <- c("ab","bb","abc","acbd","dert","abwabsabs")

st <- strsplit(s, "")[[1]]
mtc <- sapply(strsplit(substr(vc, 1, nchar(s)), ""), 
              function(i) {
                m <- i == st[1:length(i)]
                sum(m * cumsum(m))})

vc[mtc == max(mtc)]
#[1] "ab"        "abc"       "abwabsabs"

# Another vector vc
vc <- c("ab","bb","abc","acbd","dert","absq","abab")
....
vc[mtc == max(mtc)]
#[1] "absq"

文字列の先頭のみを考慮しているため、最初のケースでは、最長一致は でしたが"ab""abwabsabs"どれが を持ってい"abs"ます。

編集:これは「単一パターン」のソリューションです。おそらくもっと簡潔になる可能性がありますが、ここで...

vc <- c("ab","bb","abc","acbd","dert","abwabsabs")
(auxOne <- sapply((nchar(s)-1):1, function(i) substr(s, 1, i)))
#[1] "ab"   "a"
(auxTwo <- sapply(nchar(s):2, function(i) substring(s, i)))
#[1] "s" "bs" 
l <- attr(regexpr(
  paste0("^((",s,")|",paste0("(",auxOne,"(?!",auxTwo,"))",collapse="|"),")"),
  vc, perl = TRUE), "match.length")
vc[l == max(l)]
#[1] "ab"        "abc"       "abwabsabs"
于 2012-12-04T13:00:12.647 に答える
1

と を使用して、指定された文字列が の任意の文字列の先頭と一致するgrepかどうかを確認し、 の末尾から文字を再帰的に削除する関数を次に示します。svcs

myfun <- function(s, vc) {
  notDone <- TRUE
  maxChar <- max(nchar(vc))  # EDIT: these two lines truncate s to
  s <- substr(s, 1, maxChar) # the maximum number of chars in vc
  subN <- nchar(s)
  while(notDone & subN > 0){
    ss <- substr(s, 1, subN)
    ans <- grep(sprintf("^%s", ss), vc, val = TRUE)
    if(length(ans)) {
      notDone <- FALSE
    } else {
      subN <- subN - 1
    }
  }
  return(ans)
}

s <- "abs"
# Updated vc from @Julius's answer
vc <- c("ab","bb","abc","acbd","dert","absq","abab")

> myfun(s, vc)
[1] "absq"

# And there's no infinite recursion if there's no match
> myfun("q", "a")
character(0)
于 2012-12-04T14:18:46.420 に答える
0

事実からずっと後になって、triebeardパッケージが存在するようになったことに注意してください。最長一致または部分一致を見つけるには、非常に効率的でユーザーフレンドリーです。

于 2016-07-17T23:18:11.653 に答える