読者です 読者をやめる 読者になる 読者になる

アメリエフのブログ

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"

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

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