アメリエフのブログ

Amelieff Staff Blog

paste関数を使う

短い間ですが、弊社のトレーニングのTAを担当させていただいていた時期があります。
RのTAをやるなかで、とても便利なのに、初めてRに触れる方が戸惑われることが多いと感じたポイントのひとつに paste 関数があります。
今回は paste 関数をあれこれいじくりまわしてみます。

1.paste関数とは

複数の文字列同士を結合する関数です。

> paste("hello", "world")
[1] "hello world"

なぜpaste関数が必要かというと、Rではこのように文字列を単にprint関数に渡すことができないためです。

> print("hello","world")
以下にエラー print.default("hello", "world") : 'digits' 引数が不正です
追加情報: 警告メッセージ:
In print.default("hello", "world") : 強制変換により NA が生成されました


対話モードだとprint関数を省略することも多いので、こんな書き方をされるかもしれません。いずれにせよ、複数の文字列を並べただけでは結合できません。
> "hello","world"
エラー: 予想外の ',' です in ""hello","

paste関数は大事です。

2.paste関数の基本

使い方の簡単な例をお見せします。
数字も、文字列に変換されて結合されます。

> paste(108, "yen")
[1] "108 yen"

結合した文字列の間に挟まる文字は、sep オプションで指定可能です。指定がない場合は半角スペースが入ります。

> paste(108, "yen", sep="-")
[1] "108-yen"

文字を挟みたくないときは、sep=""と指定します。

> paste(108, "yen", sep="")
[1] "108yen"


引数には、複数の要素があるベクトルを渡すこともできます。この場合、それぞれの要素について結合されます。

■ 1対複数
> pre
[1] "gene"
> str
[1] "a" "b" "c" "d" "e"
> paste(pre, str)
[1] "gene a" "gene b" "gene c" "gene d" "gene e"

■ 複数対複数(要素の数が同じ場合)
> num
[1] 1 2 3 4 5
> suf
[1] "st" "nd" "rd" "th" "th"
> paste(num, suf, sep="")
[1] "1st" "2nd" "3rd" "4th" "5th"

■ 複数対複数(要素の数が一致しない場合)…要素が足りないほうのベクトルが使いまわされます。
> paste(num, suf[1:4], sep="")
[1] "1st" "2nd" "3rd" "4th" "5st"

ベクトル同士ではなく、ひとつのベクトルの中の各要素を結合する場合は、collapseオプションを使用します。
collapseオプションに、結合する要素同士の間に挟まれる文字を指定します。

> day
[1] "2009" "July" "1"
> paste(day, collapse="-")
[1] "2009-July-1"

sepオプションとcollapseオプションを両方指定したらどうなるでしょう?
> paste(num, suf, sep="", collapse="/")
[1] "1st/2nd/3rd/4th/5th"

ベクトル同士を結合した後、各要素を結合していますね。

もう少し実践的な例として、グラフでの使い方をみていきます。

 

(2019/8/14 ブログ移設の際に消えていた以下の箇所を修正しました。修正前の内容と変更する可能性があります)

たとえば、4つのサンプル(A、B、C、D)に対して薬剤Xの効果を測定した結果があるとします。

> act <- c(10, 15, 8, 20)
> act
[1] 10 15 8 20

 

この4つの値を棒グラフにしてみます。

> labels <- c("A", "B", "C", "D")
> barplot(act, main="Drug X activity",
        names.arg=labels)

f:id:kubo-m:20190814174133p:plain

さてグラフを作ってみたところで、各サンプルのラベルを「A、B、C、D」から「sampleA、sampleB、sampleC、sampleD」に変えたい、と思ったとします。もちろんlabelオブジェクトを作り直してもいいのですが、paste関数を使うと、こう書くことができます。

> barplot(act, main="Drug X activity",
        names.arg=paste("sample", labels,sep=""))

f:id:kubo-m:20190814174136p:plain

一度ですべての棒のラベルを変えることができました。

例ではたったの4サンプルに"sample"という文字列を付けるだけですが、サンプル数が増えたり、もっと複雑な文字列を付けたいというとき、paste関数の力のありがたみがわかってきます。

 

最後のおまけに、モノクロで素っ気ない棒グラフに、せっかくなので色をつけてみましょう。軸ラベルもきちんと設定しました。

> barcol <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c')
> barplot(act, main="Drug A activity",
        xlab="samples", ylab="Activity",
        names.arg=paste("sample", labels,sep=""),
        col=barcol)

f:id:kubo-m:20190814174144p:plain