Rの基礎とプログラミング技法『Rの基礎とプログラミング技法』を読みながら、R言語の勉強中です。遠い昔にS-PLUSを使えたこともあったので、「再」入門かな。

この本はコンパクトにまとまっていて、なかなかよい本です。Rに関する多くの本は「統計解析」に重きがおかれていますが、この本は「言語の説明」に重点があります。

今回は基礎の習得の部分から「ベクトル操作がすごい」ことについて書きます。

Rの基本的なデータ型は「ベクトル」です。そしてベクトル同士の演算処理がいろいろ用意されています。

たとえば、"apple", "pear", "orange"のそれぞれが、3,2,1個あるとき、こんな表を作ります。excelでつくってcsvではいてもいいですね。

test.txt

product,amount
apple,3
pear,2
orange,1

で、これを読み込みます。そして、apple/pear/orangeをそれぞれ、その個数繰り返したベクタを作ります。

> l <- read.table("/Users/skoji/test.txt", sep=",", header=TRUE) # 読み込みます
> l
product amount
1   apple      3
2    pear      2
3  orange      1
> rep(l$product, l$amount) # ベクタproductの要素を、それぞれamount回くりかえします
[1] apple  apple  apple  pear   pear   orange
Levels: apple orange pear

この、repでの指定の仕方がRですね。ベクタにたいして、ベクタで指定した回数だけ何かをする、ってパターンがよくあります。定型的なデータ処理ならループ構文いらず。

さっき読み込んだ表にたいしても、いろんなことができます。この例だと単純すぎるけど、データベース的なことできるんですよね。

> subset(l, product %in% c("apple","pear")) # productがappleまたはpearであるもの
product amount
1   apple      3
2    pear      2
> subset(l, amount > 2) # amountが2より大きいもの
product amount
1   apple      3

このデータ型は「データフレーム」というそうです(この本読むまで知らなかった)。

単純な一次元ベクトルについても、添え字でいろいろな操作ができます。できすぎです。

> x <- c(5,3,1,-1,9,100,10)
> x[3] # 3番目の要素
[1] 1
> x[c(5,1)] # 5番目と1番目の要素を、その順番で
[1] 9 5
> x[-c(5,1)] # 5番目と1番目の要素を除いたもの
[1]   3   1  -1 100  10
> x[c(TRUE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE)] # TRUEのところだけ
[1] 5 9
> x[x < 4] # 4未満のものだけ
[1]  3  1 -1
> x[1:3] <- c(4,3,2) # 1,2,3番目の要素を4,3,2で置き換える
> x
[1]   4   3   2  -1   9 100  10
> x[x>8] <- 0 # 8より大きい要素は0にする
> x
[1]  4  3  2 -1  0  0  0
>