R言語入門: 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 >