2

私は特殊なテキスト ファイルを使用しています。これは基本的に、名前の長いリストと、各名前に関連付けられたランダムな文字列です。私が興味を持っている特定のコンセンサス シーケンスを抽出しようとしています。シーケンスは、たとえば "STXDXIK" で、X は任意の文字です。テキスト ファイルを R に書き込んで、「TEXT」という名前を付けました。

次に、正規表現を使用して、シーケンスを含むエントリのリストを分離し、「ylist」と呼びました。

ylist<- TEXT[grep("ST[A-Z]D[A-Z]IK", TEXT, value=FALSE, perl=FALSE)]

次に、regexpr 関数を使用して、関心のあるシーケンスの位置を特定し、「r」と呼びました。

r<- regexpr("ST[A-Z]D[A-Z]IK", ylist)

問題は、このシーケンスがある場所のインデックスを、開始位置と一致数とともに取得することです。ただし、完全なシーケンスが何であるかが重要であるため、「ylist」からインデックスではなく、完全なシーケンスを抽出することに興味があります。誰でも助けることができますか?

R で substr と regmatches 関数を試しましたが、一致ごとに substr を適用する必要があります。これは、このシーケンスと多くの一致があり、regmatches が機能していないように見えるか、機能させることができないため、実用的ではありません。 、おそらく間違ったコマンドを入力したためです。

4

2 に答える 2

3

regexprとを組み合わせることができますsubstr

TEXT <- c("tedSTXDXIKsslker","janetlkajsdfSTXDXIKalkse","maggiesdfes","sdfjkSTXDXIKryan")
r <- regexpr("ST[A-z]D[A-z]IK", TEXT)
s <- substr(TEXT, r, r+attr(r, "match.length")-1)
s
# [1] "STXDXIK" "STXDXIK" ""        "STXDXIK"

をフィルタリングする""場合は、次を使用できます。

s <- s[nchar(s)>0]
# [1] "STXDXIK" "STXDXIK" "STXDXIK"

編集:gregexpr例を追加

TEXT <- c("tedSTXDXIKsslker","janetlkajsdfSTXDXIKalkse","maggiesdfes","sdfjkSTXDXIKryan",
      "sdfjkSTXDXIKryansdfjkSTXDXIKryan")
## use gregexpr instead of regexpr
r <- gregexpr("ST[A-z]D[A-z]IK", TEXT)
## because gregexpr returns a list, we have to use mapply (or a for loop)
## please note: I use substring instead of substr here because substr returns only a vector of the same size as the input vector.
mapply(FUN=function(str, rx)substring(str, rx, rx+attr(rx, "match.length")-1), str=TEXT, rx=r)

# $tedSTXDXIKsslker
# [1] "STXDXIK"
# 
# $janetlkajsdfSTXDXIKalkse
# [1] "STXDXIK"
# 
# $maggiesdfes
# [1] ""
# 
# $sdfjkSTXDXIKryan
# [1] "STXDXIK"
# 
# $sdfjkSTXDXIKryansdfjkSTXDXIKryan
# [1] "STXDXIK" "STXDXIK"
于 2013-08-26T14:36:55.340 に答える