R (tidyverse), starts_with, ends_with

select() 関数の中で、列名を指定する時に便利な関数があります。 starts_with()ends_with() です。

オブジェクト %>% select(starts_with("文字列"))

サンプルが数十個あるような時に、select() 関数に全て書くのも大変です。そのような時は、列名に Sample1, Sample2 や WT1, WT2 のように、共通の文字で始まる名前を付けておくと良いです。そうすれば、 starts_with("Sample")starts_with("WT") のように関数を使ってまとめて指定できます。

一方、 WT_1h, KO_1h や WT_12h, KO_12h のように、末尾に共通な文字で指定したい場合は、 ends_with() が使えます。 ends_with("_1h")ends_with("_12h") のように指定します。

select() 関数の中で指定することを忘れないようにしましょう。

samples <- result_data %>% select(starts_with("Sample"))

> result_data
# A tibble: 3 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id3   CCC    lorem ipsum c       3       6
2 id2   BBB    lorem ipsum b       2       5
3 id1   AAA    lorem ipsum a       1       4
>
>
> samples
# A tibble: 3 x 2
  Sample1 Sample2
    <dbl>   <dbl>
1       3       6
2       2       5
3       1       4

 

R (tidyverse), write_tsv

tibble 形式のテーブルを出力するには、write_tsv() 関数を使います。タブ区切りテキスト (tsv) で出力できます。

write_tsv(テーブル名, "出力ファイル名")

標準の設定では、列の名前 (colnames) は出力されますが、rownames は出力されません。(tibble 形式のテーブルであれば、rownames を使ってないはずです。行の名前は、テーブルに含まれる列の1つとして扱います。)

write_tsv(result_data, "result_data.tsv")

出力する前に、データの並び替えをしたい場合は、 arrange() 関数でソートできます。(下記の例では、さらに desc() で降順にソートしてます。)

result_data <- inner_join(input_data, meta_data) %>%
  select(Id, Symbol, Description, Sample1, Sample2) %>%
  filter(Sample2 > 1) %>%
  arrange(desc(Sample2))

write_tsv(result_data, "result_data.tsv")

> result_data
# A tibble: 3 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id3   CCC    lorem ipsum c       3       6
2 id2   BBB    lorem ipsum b       2       5
3 id1   AAA    lorem ipsum a       1       4

 

DNBSEQ スタートアップキャンペーン

株式会社セルイノベーターでは、現在、DNBSEQ シーケンサーを使った RNA-seq 受託解析サービスのスタートアップキャンペーンを開催中です。(7月31日受注分まで)

これまでのマイクロアレイ受託解析と同様に、お預かりしたサンプルのQC→シークエンス→データ解析を全て自社(国内)で実施します。

基本的に発現変動遺伝子の解析は、マイクロアレイでもRNA-seqでも変わりません。コストやスケジュールなどの観点から、マイクロアレイの方が良いケースもあります。お悩みの場合は、ぜひ、ご相談ください。

 

R (tidyverse), %>% パイプ

select 関数の記事でも少し触れましたが、 tidyverse パッケージを用いた R では、シェルスクリプトのようなパイプの処理が可能です。具体的には、 %>% という演算子を用います。

オブジェクト %>% 関数(引数2)

演算子の左側に書かれたオブジェクトが、演算子の右側の関数の引数に用いられます。例えば、次のような表現が可能です。

result_data %>% select(Symbol, Sample1)

上記では、result_data を select() 関数の最初の引数として渡しています。つまり、下記の表現と同義です。

select(result_data, Symbol, Smple1)

パイプ %>% を使った表現の何がメリットかというと、処理結果を連続して渡せることです。よって、下記のような表現が可能です。

result_data %>% select(Symbol, Sample1) %>% filter(Sample1 > 1)

これで、select関数で列を選択したのち、filter関数で行を選択するという作業を続けて書けます。途中で改行を挟んでも良いので、コードも読みやすくなります。

result_data <- input_data %>%
  inner_join(meta_data)   %>%
  select(Symbol, Sample1) %>%
  filter(Sample > 1)

上記のように続けて書くと、「inner_join で結合したのち、select で列を選択し、filter で行を選択した結果が result_data に入る」という意味になります。

もし、パイプを使わなかったら、下記のような表現になるでしょう。

result_data <- inner_join(result_data, meta_data)
result_data <- select(result_data, Symbol, Sample1)
result_data <- filter(result_data, Sample > 1)

# もしくは、無理やり1行で、、、
result_data <- filter(select(inner_join(input_data, meta_data), Symbol, Sample1), Sample1 > 1)

同じ変数に代入し続けたり、ネストを深くする書き方は、避けたほうが無難です。後でコードを見返したときに分かりにくくなるためです。コーディングのミスや、デバッグ時の手間の増加につながります。

 

R (tidyverse), filter

列を選択する場合は、select() 関数を用いますが、それに対して、「行を選択する」には、 filter() 関数を用います。

filter(対象のデータ, 条件式)

具体的には、下記のようになります。filter(result_data, Symbol == "AAA") の部分。

> result_data
# A tibble: 3 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id1   AAA    lorem ipsum a       1       4
2 id2   BBB    lorem ipsum b       2       5
3 id3   CCC    lorem ipsum c       3       6
>
>
> filter(result_data, Symbol == "AAA")
# A tibble: 1 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id1   AAA    lorem ipsum a       1       4

条件式には、かつ (AND)、または (OR) の表現も可能です。AND を意味するの記号が & 、OR を意味する記号が | です。(&&, || と2つ書くとエラーにはなりませんが、違う動作になるため注意しましょう。)下記は、 Sample1 の値が 1 以上、かつ、 Sample2 の値が 2 以上という条件の例です。

> filter(result_data, Sample1 > 1 & Sample2 > 2)
# A tibble: 2 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id2   BBB    lorem ipsum b       2       5
2 id3   CCC    lorem ipsum c       3       6

文字列が対象で、複雑な条件式(正規表現など)が必要な場合は、stringr パッケージを用います。(tidyverse を読み込むと自動で読み込まれます。)

例えば、「特定の文字列を含む」という条件式は、 str_detect() を使います。filter() の条件式の部分に str_detect(対象の文字列, パターン) を記述します。

> filter(result_data, str_detect(Description, "ipsum a"))
# A tibble: 1 x 5
  Id    Symbol Description   Sample1 Sample2
  <chr> <chr>  <chr>           <dbl>   <dbl>
1 id1   AAA    lorem ipsum a       1       4

stringr パッケージには、他にも、文字列を置換 (str_replace) したり、連結 (str_c) したりする関数が含まれています。

検出 (str_detect), 置換 (str_replace), 連結 (str_c), 大文字に変換(str_to_upper), 小文字に変換 (str_to_lower), 先頭だけ大文字 (str_to_title)

https://stringr.tidyverse.org