Bioconductor解説 Biostrings編 その4


#過去記事


[Bioconductor 解説 Biostrings 編 その１](https://qiita.com/Kazuki-Nakamae/items/dd8859c5fe5a2e2d9671 "")

[Bioconductor 解説 Biostrings 編 その２](https://qiita.com/Kazuki-Nakamae/items/ae16c962615ad11b5c01 "")

[Bioconductor 解説 Biostrings 編 その３](https://qiita.com/KazukiNakamae/items/cfcc2dbb972dedfe722b "")


#はじめに

今回はこれまで紹介していないXStringオブジェクト・XStringSetオブジェクトの基礎的なメソッド・演算子を紹介していきたいと思います。
紹介内容はBioconductorが配布しているマニュアル「[Biostrings Quick Overview](https://bioconductor.org/packages/release/bioc/vignettes/Biostrings/inst/doc/BiostringsQuickOverview.pdf "Biostrings Quick Overview")」に準拠しています。


##head()
| 対象オブジェクト | 適用 |
|:-----------------------|:--|
| XString オブジェクト     |✅|
| XStringSet オブジェクト  |✅|

XStringオブジェクトに適用した場合、配列の5'側のほうの配列を取り出します。
XStringSetオブジェクトに適用した場合、インデックスが小さいほうの配列を取り出します。


###XStringオブジェクトでの引数
####x
：XStringオブジェクト
####n
：取り出す文字数（左側から）

```R:例
message("例１")
head( DNAString( x="AAACCCCCCAA" ) )

message("例２")
head( DNAString( x="AAACCCCCCAA" ), n=3 )
```


```bash:出力
例１
  6-letter "DNAString" instance
seq: AAACCC

例２
  3-letter "DNAString" instance
seq: AAA
```


###XStringSetオブジェクトでの引数
####x
：XStringSetオブジェクト
####n
：取り出す配列の数（インデックスが小さいほうから）


```R:例
seq.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" ) # 配列7個

message("例１")
head( DNAStringSet( x=seq.vec ) )

message("例２")
head( DNAStringSet( x=seq.vec ), n=2 )
```


```bash:出力
例１
  A DNAStringSet instance of length 6
    width seq
[1]     2 AA
[2]     4 TGTG
[3]     3 AAC
[4]     2 CA
[5]     4 TGCG
[6]     3 TTC

例２
  A DNAStringSet instance of length 2
    width seq
[1]     2 AA
[2]     4 TGTG
```


##tail()
| 対象オブジェクト | 適用 |
|:-----------------------|:--|
| XString オブジェクト     |✅|
| XStringSet オブジェクト  |✅|

XStringオブジェクトに適用した場合、配列の3'側のほうの配列を取り出します。
XStringSetオブジェクトに適用した場合、インデックスが大きいほうの配列を取り出します。

###XStringオブジェクトでの引数
####x
：XStringオブジェクト
####n
：取り出す文字数（右側から）

```R:例
message("例１")
tail( DNAString( x="AAACCCCCCAA" ) )

message("例２")
tail( DNAString( x="AAACCCCCCAA" ), n=3 )
```


```bash:出力
例１
  6-letter "DNAString" instance
seq: CCCCAA

例２
  3-letter "DNAString" instance
seq: CAA
```


###XStringSetオブジェクトでの引数
####x
：XStringSetオブジェクト
####n
：取り出す配列の数（インデックスが大きいほうから）


```R:例
seq.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" ) # 配列7個

message("例１")
tail( DNAStringSet( x=seq.vec ) )

message("例２")
tail( DNAStringSet( x=seq.vec ), n=2 )
```


```bash:出力
例１
  A DNAStringSet instance of length 6
    width seq
[1]     2 CA
[2]     4 TGCG
[3]     3 TTC
[4]     3 AAC
[5]     2 CA
[6]     3 TTC

例２
  A DNAStringSet instance of length 2
    width seq
[1]     2 CA
[2]     3 TTC
```


##rev()
| 対象オブジェクト | 適用 |
|:-----------------------|:--|
| XString オブジェクト     |✅|
| XStringSet オブジェクト  |✅|

XStringオブジェクトに適用した場合、配列を逆順に並び替えます。
XStringSetオブジェクトに適用した場合、インデックスの順番を逆にします。

###XStringオブジェクトでの引数
####x
：XStringオブジェクト

```R:例
message("例")
rev( DNAString( x="AAACCCCCCAA" ) )
```


```bash:出力
例
  11-letter "DNAString" instance
seq: AACCCCCCAAA
```


###XStringSetオブジェクトでの引数
####x
：XStringSetオブジェクト


```R:例
seq.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )

message("例")
rev( DNAStringSet( x=seq.vec ) )
```


```bash:出力
例
  A DNAStringSet instance of length 9
    width seq
[1]     3 TTC
[2]     2 CA
[3]     3 AAC
[4]     3 TTC
[5]     4 TGCG
[6]     2 CA
[7]     3 AAC
[8]     4 TGTG
[9]     2 AA
```

##c()
| 対象オブジェクト | 適用 |
|:-----------------------|:--|
| XString オブジェクト     |✅|
| XStringSet オブジェクト  |✅|

XStringオブジェクトに適用した場合、配列を結合します。
XStringSetオブジェクトに適用した場合、配列を追加します。

###XStringオブジェクトでの引数
####x
：結合先XStringオブジェクト

####y
：結合されるXStringオブジェクト

※引数は無制限で増やせます。

```R:例
message("例")
c( DNAString( x="AAACCCCCCAA" ), DNAString( x="TGGCGTA" ) )
```


```bash:出力
例
  18-letter "DNAString" instance
seq: AAACCCCCCAATGGCGTA
```


###XStringSetオブジェクトでの引数
####x
：追加先XStringSetオブジェクト

####y
：追加されるXStringSetオブジェクト

※引数は無制限で増やせます。


```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )
seq2.vec <- c( "CC", "GAT", "CCCCC", "GTA" )

message("例")
c( DNAStringSet( x=seq1.vec ), DNAStringSet( x=seq2.vec ) )
```


```bash:出力
例
  A DNAStringSet instance of length 13
     width seq
 [1]     2 AA
 [2]     4 TGTG
 [3]     3 AAC
 [4]     2 CA
 [5]     4 TGCG
 ...   ... ...
 [9]     3 TTC
[10]     2 CC
[11]     3 GAT
[12]     5 CCCCC
[13]     3 GTA
```

###c()を入れ子にした場合

ちなみに入れ子にした場合は次のような挙動になります。


```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )
seq2.vec <- c( "CC", "GAT", "CCCCC", "GTA" )
seq3.vec <- c( "TTTTT", "AAAAAAAA")

message("例")
c( c( DNAStringSet( x=seq1.vec ), DNAStringSet( x=seq2.vec ) ), DNAStringSet( x=seq3.vec ))
```


```bash:出力
例
  A DNAStringSet instance of length 15
     width seq
 [1]     2 AA
 [2]     4 TGTG
 [3]     3 AAC
 [4]     2 CA
 [5]     4 TGCG
 ...   ... ...
[11]     3 GAT
[12]     5 CCCCC
[13]     3 GTA
[14]     5 TTTTT
[15]     8 AAAAAAAA
```

内包されたc()が内部で展開されて、一つのXStringSetオブジェクトとして作成されます。
通常、`c()`で作成されるベクトル型は先ほどのように入れ子にすると同様に展開されます。XStringSetオブジェクトのメソッド`c()`も同様の仕様になっているといえるでしょう。

```R:例
message("例")
c( c(1, 2), 3 )
```


```bash:出力
例
[1] 1 2 3
```

どうしても入れ子の状態でデータを保持しておきたい場合は`c()`ではなく`list()`を使えばよいです。

```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )
seq2.vec <- c( "CC", "GAT", "CCCCC", "GTA" )
seq3.vec <- c( "TTTTT", "AAAAAAAA")

message("例")
list(
	list( DNAStringSet( x=seq1.vec ), DNAStringSet( x=seq2.vec ) ),
	DNAStringSet( x=seq3.vec )
	)
```


```bash:出力
例
[[1]]
[[1]][[1]]
  A DNAStringSet instance of length 9
    width seq
[1]     2 AA
[2]     4 TGTG
[3]     3 AAC
[4]     2 CA
[5]     4 TGCG
[6]     3 TTC
[7]     3 AAC
[8]     2 CA
[9]     3 TTC

[[1]][[2]]
  A DNAStringSet instance of length 4
    width seq
[1]     2 CC
[2]     3 GAT
[3]     5 CCCCC
[4]     3 GTA


[[2]]
  A DNAStringSet instance of length 2
    width seq
[1]     5 TTTTT
[2]     8 AAAAAAAA
```

あとこれはRの基本知識ですが、list()で作成されるリスト型の要素は型が違っていても格納できます（忘れがち？）。

```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )

message("例")
list(
	DNAStringSet( x=seq1.vec ),
	DNAString( x="AAACCCCCCAA" ),
	3
	)
```


```bash:出力
例
[[1]]
  A DNAStringSet instance of length 9
    width seq
[1]     2 AA
[2]     4 TGTG
[3]     3 AAC
[4]     2 CA
[5]     4 TGCG
[6]     3 TTC
[7]     3 AAC
[8]     2 CA
[9]     3 TTC

[[2]]
  11-letter "DNAString" instance
seq: AAACCCCCCAA

[[3]]
[1] 3
```

##==（等価演算子）
| 対象オブジェクト | 適用 |
|:-----------------------|:--|
| XString オブジェクト     |✅|
| XStringSet オブジェクト  |✅|

XStringオブジェクトに適用した場合、配列が同一の場合はTRUE、違えばFALSEです。
XStringSetオブジェクトに適用した場合、同じインデックス間で配列を比較して同じであればTRUE、違えばFALSEと判定し、最終的に論理値ベクトルを返します。

###XStringオブジェクトの場合


```R:例
message("例１")
DNAString( x="AAACCCCCCAA" ) == DNAString( x="AAACCCCCCAA" )
message("例２")
DNAString( x="AAACCCCCCAA" ) == DNAString( x="TTACCCCCCAC" )
```


```bash:出力
例１
[1] TRUE
例２
[1] FALSE
```


###XStringSetオブジェクトの場合


```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )
seq2.vec <- c( "AA", "TTT", "AAC", "A", "TGCG", "TT", "AAC", "CA", "TTC" )
seq3.vec <- c( "AA", "TTTT", "A", "CA", "TGCG", "TTC" )

message("例１")
DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq2.vec )

message("例２")
DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq3.vec )
```


```bash:出力
例１
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
例２
[1]  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
Warning message:
In .Call2("XRawList_pcompare", x, y, PACKAGE = "XVector") :
  longer object length is not a multiple of shorter object length

```

比較したXStringSet間で配列数に違いがある場合は、その分だけリピートして比較を行います。

ちなみにすべての配列が一致しているかどうかを判定する場合は`all()`、どれか一つでも一致しているかどうか判定する場合は`any()`が使えます。

```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )
seq2.vec <- c( "AA", "TTT", "AAC", "A", "TGCG", "TT", "AAC", "CA", "TTC" )
seq3.vec <- c( "AC", "TGT", "CAC", "T", "AGCG", "GT", "C", "A", "TAC" )

message("例１")
all( DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq1.vec ) )

message("例２")
all( DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq2.vec ) )

message("例３")
any( DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq1.vec ) )

message("例４")
any( DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq2.vec ) )

message("例５")
any( DNAStringSet( x=seq1.vec ) == DNAStringSet( x=seq3.vec ) )
```

```bash:出力
例１
[1] TRUE
例２
[1] FALSE
例３
[1] TRUE
例４
[1] TRUE
例５
[1] FALSE
```


##%in%演算子
| 左オブジェクト| 右オブジェクト | 適用 |
|:-----------------------|:-----------------------|:--|
| XString オブジェクト     | XString オブジェクト     |❌|
| XStringSet オブジェクト  | XString オブジェクト     |✅|
| XString オブジェクト     | XStringSet オブジェクト     |✅|
| XStringSet オブジェクト  | XStringSet オブジェクト     |✅|

左オブジェクトの配列が右オブジェクトの配列と一致しているかを判定します。

※ %in%演算子はmatch()でも代用できます。


```R:例
seq1.vec <- c( "AA", "TGTG", "AAC", "CA", "TGCG", "TTC", "AAC", "CA", "TTC" )
seq2.vec <- c( "AA", "TTT", "AAC", "A", "TGCG", "TT", "AAC", "CA", "TTC" )
seq3.vec <- c( "AC", "TGT", "CAC", "T", "AGCG", "GT", "C", "A", "TAC" )
seq4.vec <- c( "AA", "TTT", "AAC", "A" )

message("例１")
DNAStringSet( x=seq1.vec ) %in% DNAString( x="AAC" )

message("例２")
DNAString( x="AAC" )　%in% DNAStringSet( x=seq1.vec )

message("例３")
DNAStringSet( x=seq1.vec ) %in% DNAStringSet( x=seq1.vec )

message("例４")
DNAStringSet( x=seq1.vec ) %in% DNAStringSet( x=seq2.vec )

message("例５")
DNAStringSet( x=seq1.vec ) %in% DNAStringSet( x=seq3.vec )

message("例６")
DNAStringSet( x=seq1.vec ) %in% DNAStringSet( x=seq4.vec )

```


```bash:出力
例１
[1] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE
例２
[1] TRUE
例３
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
例４
[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
例５
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
例６
[1]  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE
```

%in%はBiostringに限らずよく使われる演算子で、以下のように左に文字、右にベクトルをおいて一致する要素があるか判定させたりします

```R:例
blacklist.vec <- c("Sato", "Suzuki", "Tanaka")
"Suzuki" %in% blacklist.vec
```

```bash:出力
[1] TRUE
```


例２がそれと同じ使い方ですね。

XStringSet同士を比較した場合は、等価演算子と同じ挙動をします。

#さいごに

紹介するメソッドはまだまだありますが、長くなってきたのでとりあえずここまでとします。

今回紹介したメソッドの仕様はRの基本型の関数仕様とよく似ています。特にXStringSetオブジェクト系はほとんどベクトル型の挙動そっくりになっていると思うので、ぜひ気軽に触ってみてはいかがでしょうか。
では次回に続きます。