文字列

R は計算をメインに行う統計解析用だが、文字列の切り出しや置換などの文字列処理を行う関数も用意されている。文字列の分割や正規表現を用いたパターンマッチングなども行える。

文字列マッチング関数

文字列のパターンマッチは grepregexpr を利用する。一方、完全一致による文字列マッチングを行う場合は match または charmatch を利用する。

パターンマッチ grep regexpr

grep はマッチしたかどうかを返すのに対して、regexpr はマッチした位置やマッチした長さなどを返す。grepregexpr のパターンには正規表現を用いることができる。

files <- c("NM20001.gb", "NN30012.gb", "NM20111.fa", "NM20121.fa")

#「.gb」で終わる要素を検索
grep("\\.gb$", files)      # files ベクトルの 1 と 2 の要素が .gb で終わっている
## [1] 1 2

#「.sam」で終わる要素を検索
grep("\\.sam$", files)     # files ベクトルには .sam で終わっている要素はない
## integer(0)


seq <- c("GATGC", "ATATA", "CGCGC")

#ATGの位置を検索
regexpr("ATG", seq)
## [1]  2 -1 -1               #マッチした位置
attr(,"match.length")      
## [1]  3 -1 -1               #マッチした文字列の長さ
attr(,"useBytes")
## [1] TRUE                   #マッチは1バイトずつで行う
#regexpr("日本語", str, useBytes=F)  #全角文字は文字ごとにマッチングさせる


#GCの位置を検索
regexpr("GC", seq)
## [1]  4 -1  2
attr(,"match.length")
## [1]  2 -1  2
attr(,"useBytes")
## [1] TRUE

文字列一致 match charmatch

match 関数は文字列の完全一致によるマッチを行う。第 1 引数にはパターンを指定し、第 2 引数には対象文字列を指定する。なお、パターンは複数指定できる。charmatch は部分文字列の完全一致によるマッチを行う。使い方は match と同じく、パターンと対象文字列を指定して行う。

seqA <- c("ATG", "GC", "AT", "GCGC")
seqB <- c("CGCA", "GC", "AT", "AT", "ATA")

#seqAのうち「GC」と完全マッチする要素
match("GC", seqA)  #matchの場合は最初から最後まで同じであればマッチする
## [1] 2
grep("GC", seqA)   #grepの場合はGCが含まれていればマッチする
## [1] 2 4
grep("^GC$", seqA) #grepの正規表現を利用してmatchと同じ機能を実現
## [1] 2


#seqAで示すパターンのうち、seqBのどの要素がそれに完全一致するか
match(seqA, seqB)
## [1] NA  2  3 NA
# seqA[1]の「ATG」 にマッチするseqBの要素はない
# seqA[2]の「GC」  にマッチするseqBの要素は2番目にある
# seqA[3]の「AT」  にマッチするseqBの要素は3番目にある(2個目以降は無視される)
# seqA[4]の「GCGC」にマッチするseqBの要素はない


#seqAで示すパターンのうち、seqBのどの要素がそれに部分一致する
charmatch(seqA, seqB)
## [1] NA  2  0 NA
# seqA[1]の「ATG」 にマッチするseqBの要素はない
# seqA[2]の「GC」  にマッチするseqBの要素は2番目にありる
# seqA[3]の「AT」  にマッチするseqBの要素は複数ある(複数の場合は「0」を返す)
# seqA[4]の「GCGC」にマッチするseqBの要素はない

文字列の切り出し

文字列から一部だけ切り出すとき substrsubstring を利用する。両者はほぼ同様に扱えて、第 1 引数には対象文字列、第 2 引数には切出しの開始位置、第 3 引数には切出しの終了位置を指定する。( 1 文字目の位置は、他のプログラミング言語では「0」であるのに対して、R は「1」である。)

dna <- c("AAGCT", "TTAAA", "CCTAT")

substr(dna, 2, 3)
## [1] "AG" "TA" "CT"

substring(dna, 2, 3)
## [1] "AG" "TA" "CT"

文字列置換

文字列の置換を行う関数は sub gsub chartr などがある。gsub は条件に合ったものをすべて置換するのに対して、sub は条件に合ったもののうち最初の 1 だけを置換する。また、chartr は一文字ずつの置換を行う関数である。例えば、文字列中の A、C、G、T をすべて小文字に書き換えたり、その相補塩基を書き換えたりするときに利用する。

dna <- c("AAGCAT", "TAATAA", "CCTAT")

sub("TA", "ta", dna)
## [1] "AAGCAT" "taATAA" "CCtaT" 

gsub("TA", "ta", dna)
## [1] "AAGCAT" "taAtaA" "CCtaT"

# dna =~ tr/ACGT/TGCA/ 
chartr("ACGT", "TGCA", dna)
## [1] "TTCGTA" "ATTATT" "GGATA"

文字列の結合

paste は結合させたい文字列(ベクトル)を代入し、結合文字を sep あるいは collapse で指定して、文字列の結合を行う。結合文字を入れない場合は sep = "" のように空文字を指定する。

rna <- c("ACAACACGATGT" , "CACANCGATC" , "NNCTCGCTAGC")
tail <- c("AAAAAA")

paste(rna , tail , sep = "_")
## [1] "ACAACACGATGT_AAAAAA" "CACANCGATC_AAAAAA"   "NNCTCGCTAGC_AAAAAA"

paste(rna , tail , sep = "-", collappse = "_")
## [1] "ACAACACGATGT-AAAAAA-_" "CACANCGATC-AAAAAA-_"   "NNCTCGCTAGC-AAAAAA-_"



x <- c("AAA", "BBB", "CCC")
y <- c("XXX", "YYY")

paste(x, y, sep = "-")
## [1] "AAA-XXX" "BBB-YYY" "CCC-XXX"

paste(x, y, sep = "-", collapse = "=")
## [1] "AAA-XXX=BBB-YYY=CCC-XXX"

paste を利用するとき sepcollapse を空文字にしたいときは paste0 を利用すると便利。

paste0("AAA", "BBB", "CCC")
## [1] "AAABBBCCC"

文字列の分割

strsplit には正規表現を用いることができる。strsplit は、1 番目の引数に対象文字列を、2 番目の引数に区切り文字を指定して、文字列の切断を行う。切断された文字列はリスト型で返す。

rna <- c("ACCCGTACGTATCGATC" , "CTTCAAACTGTCAAC" , "ACCACGATGTAGT")
strsplit(rna , "GT[GC]")
##
##[[1]]
## [1] "ACCCGTACGTATCGATC"
##
##[[2]]
## [1] "CTTCAAACT" "AAC"
##
##[[3]]
## [1] "ACCACGATGTAGT"

その他の文字列操作関数

関数機能
nchar文字列の長さを調べる。
toupper小文字をすべて大文字に変換する。
tolower大文字をすべて小文字に変換する。
DNA <- c("CCTAGGGAAACCAG" , "TGTCCGGGATACG" , "CCTCAGGGCCTA" , "CGTGGGTACCGT")

#tolower
dna <- tolower(DNA)
dna
## [1] "cctagggaaaccag" "tgtccgggatacg"  "cctcagggccta"   "cgtgggtaccgt"

#toupper
DNA <- toupper(dna)
DNA
## [1] "CCTAGGGAAACCAG" "TGTCCGGGATACG"  "CCTCAGGGCCTA"   "CGTGGGTACCGT"

#nchar
nchar(DNA)
## [1] 14 13 12 12

R のパターンマッチ関数 grepmatch、文字列置換関数 sub などの関数は、正規表現に対応している。正規表現に用いるメタ文字は、以下に示したようなものがある。

( )複数の文字を一つのパターンとしてまとめる。
[ ]クラスです。[ ]に囲まれた文字列のうちいずれかの1文字を表す。
$後尾
^先頭、また[ ]の中で使うと、「それ以外」を表す。
?直前のパターンが、0 回または 1 回だけ繰り返すことを表す。
*直前のパターンが、0 回以上に繰り返すことを表す。
+直前のパターンが、1 回以上に繰り返すことを表す。
{2,5}前出パターンが、2 回以上 5 回以下に繰り返すことを表す。
.任意の一文字を表します。
|「または」を表します。
\メタ文字をエスケープする際に用いる。

正規表現の例。

# 最初から最後までがアルファベットと数値のみで表現される文字列
grep("^[[:alnum:]]+$", x)

# ATTまたはATCまたはACTを含む文字列
grep("(ATT|ATC|ACT)", x)

# ATTまたはATCまたはACTで終わる文字列
grep("(ATT|ATC|ACT)$", x)

# A,C,G,T,U,Xのみからなる文字列
grep("[^ACGTUX]", x)

# A,C,G,T,U,X以外も文字を含む文字列
grep("[^ACGTUX]", x)

# セリンに表すコドンを含む文字列(セリン:UCU, UCC, UCA, UCG, AGU, AGC)
grep("(UC.|AG[CU])", x)

# GCが2つ以上連続するパターンを含む文字列
grep("(GC){2,}" ,x)

# GCまたはCGが2つ以上連続するパターンを含む文字列
grep("(GC|CG){2,}" ,x)

後方参照

R で後方参照を行うため方法が用意されていない。後方参照用の関数を自作するか、後方参照をサポートするパッケージをインストールして利用するか、で対応する。ここでは、regexpr の属性を利用して後方参照を実現する例を示す。

# 文字列を用意
x <- c("CATTCGTAC", "GGCGAT", "TCGTATTGCATCAG", "ACCGTA")

# 正規表現によるマッチング
m <- regexpr("A.T", x)

# m にはマッチング箇所の開始位置が代入されている
# mのmatch.length属性にはマッチング箇所の終了位置が代入されている

# マッチング箇所の開始位置から終了位置を取得する
back_ref <- substr(x, m, m + attr(m, "match.length") - 1)

back_ref
## [1] "ATT" ""    "ATT" ""