8

すべての要素が折りたたまれた単一の要素であるかのように、Rでベクトル内の正規表現を検索することは可能ですか? これを行うためにすべての要素を 1 つに折りたたむと、検索後に要素ごとの形式に戻すことができなくなります。

ここにベクトルがあります。

vector<-c("I", "met", "a", "cow")

現在、検索ワードは「meta」です (要素 2 と 3 は折りたたまれています)。

私の仕事は、検索文字列が横たわる 2 つの要素をマージすることだとしましょう。

だから私が期待するのはこれです:

vector = "I", "meta", "cow"

これを行うことは可能ですか?助けてください。

4

3 に答える 3

5

一致するが一致"meta"しないものが必要な場合は"taco"、これでうまくいきます。

myFun <- function(vector, word) {
    D <- "UnLiKeLyStRiNg" 

    ## Construct a string on which you'll perform regex-search
    xx <- paste0(paste0(D, vector, collapse=""), D)

    ## Construct the regex pattern
    start <- paste0("(?<=", D, ")")
    mid <- paste0(strsplit(word, "")[[1]], collapse=paste0("(", D, ")?"))
    end <- paste0("(?=", D, ")")
    pat <- paste0(start, mid, end)

    ## Use it
    strsplit(gsub(pat, word, xx, perl=TRUE), D)[[1]][-1]
}

vector <- c("I", "met", "a", "cow")

myFun(vector, "meta")
# [1] "I"    "meta" "cow" 
myFun(vector, "taco")
# [1] "I"   "met" "a"   "cow"
myFun(vector, "Imet")
# [1] "Imet" "a"    "cow" 
myFun(vector, "Ime")
# [1] "I"   "met" "a"   "cow"
于 2012-09-03T23:16:14.730 に答える
3

完全な要素のみをマージする必要がある場合は、次のアプローチを試すことができます。

mergeRegExpr <- function(x, pattern) {
    str <- paste(x, sep="", collapse="")

    ## find starting position of each word
    wordStart <- head(cumsum(c(1, nchar(x))), -1)

    ## look for pattern
    rx <- regexpr(pattern=pattern, text=str, fixed=TRUE)

    ## pos of matching pattern == rx+nchar(pattern)-1
    rxEnd <- rx+attr(rx, "match.length")-1

    ## which vector elements doesn't match pattern
    sel <- wordStart < rx | wordStart > rxEnd

    ## insert merged elements
    return(append(x[sel], paste(x[!sel], collapse=""), rx-1))
}

vector <- c("I", "met", "a", "cow")

mergeRegExpr(vector, "meta")
# "I"    "meta" "cow"
mergeRegExpr(vector, "acow")
# "I"    "met"  "acow"
mergeRegExpr(vector, "Imeta")
# "Imeta" "cow"

## partial matching doesn't work    
mergeRegExpr(vector, "taco")
# "I"       "metacow"
于 2012-09-03T17:52:22.113 に答える
2

Carl Witthoft のコメントに基づいて、私の解決策は正規表現ではなく、基本的なマッチングでした。

# A slightly longer vector
v = c("I", "met", "a", "cow", "today",
      "You", "met", "a", "cow", "today")

# Create the combinations of each pair
temp1 = sapply(1:(length(v)-1), 
               function(x) paste0(v[x], v[x+1]))

# Grab the index of the desired search term
temp2 = which(temp1 %in% "meta")
# The following also works.
# Don't know what's faster/better.
# temp2 = grep("meta", temp1)

# Do some manual substitution and deletion
v[temp2] <- "meta"
v <- v[-(temp2+1)]

しかし、これは理想的な状況ではないと思います。

于 2012-09-03T17:27:30.477 に答える