![]() |
ノート/R/Rを使ってみるhttp://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FR%2FR%A4%F2%BB%C8%A4%C3%A4%C6%A4%DF%A4%EB |
![]() |
ノート/ノート
ノート/R
訪問者数 2622 最終更新 2010-03-04 (木) 11:49:32
Rに関する覚書きメモ
参考になるサイト
> [[同志社 金明哲先生のページ;http://www1.doshisha.ac.jp/~mjin/R/]]
>> 特に基本統計量 関数
視覚化1
視覚化2
視覚化3
> 阪大RWikiの貢献パッケージリスト
> RjpWiki
> 船尾さんのR-tips
> 統計処理ソフト R 入門 講習会資料
Rはインタラクティブに使えるが、スクリプトファイルを実行する形でも使える。
source("スクリプトのファイル名")
ファイル名の拡張子は .R
ファイルの所在は、Current Directoryの概念があって、「ファイル」⇒「ディレクトリの変更」で設定・選択できる。
コマンドから設定する方法は?
コンマ区切りの表(たとえばExcelのCSVデータなど)は、
x <- read.table("ファイル名", sep=",")
で読める。但しファイルはCurrent Directoryにあること。
CSVだと分かっていれば、x <= read.csv("ファイル名")でOK
書き出しも
write.table(x, file="ファイル名", sep=",")
で出来る。
vector: 順番に並んだ数numberの集まり(a single entity consisting of an ordered collection of numbers)
作成するにはx <- c(10.4, 5.6, 3.1, 6.4, 21.7)
要素を取り出すにはx[3]
もし[3,]と書くと、イメージとしては[3,*]、つまり[3,1],[3,2],[3,3]...というvectorが得られる。
同様に[,3]と書くと、[*,3]、つまり[1,3],[2,3],[3,3]...というvectorになる。
matrix, array: 多次元(2次元以上?)にしたvector。(multi-dimensional generalizations of vectors)
list: vectorの一般形で、要素の型が同一でなくても良い(a general form of vector in which the various elements need not be of the same type)
factors: 分類的(categorical)データを扱うコンパクトな方法。(factors provide compact ways to handle categorical data)。要するにENUM型のvectorらしい。 たとえば、文字型vector ("a","b","c")のfactorは、(a,b,c)らしい。
z<-c("東京","千葉","埼玉","茨城","栃木","群馬","神奈川","東京","千葉","埼玉","茨城","栃木","群馬","神奈川") z [1] "東京" "千葉" "埼玉" "茨城" "栃木" "群馬" "神奈川" "東京" [9] "千葉" "埼玉" "茨城" "栃木" "群馬" "神奈川" fz <- factor(z) fz [1] 東京 千葉 埼玉 茨城 栃木 群馬 神奈川 東京 千葉 埼玉 [11] 茨城 栃木 群馬 神奈川 Levels: 茨城 群馬 埼玉 神奈川 千葉 東京 栃木
これがおもしろいのは、tapplyという仕掛を使うときらしい。
こんな例が出ている。14人の納税者がいる。それぞれの居住県はzで表される。同様にそれぞれの納税額は14要素のvector y で表される。但しyは
y <- c(2, 7, 5, 6, 3, 9, 1, 6, 2, 4, 3, 7, 8, 3)
この情報にtapplyを使うと、同じ県に属する人を集めて関数meanを適用する処理が出来る。
tapply(y, z, mean) 茨城 群馬 埼玉 神奈川 千葉 東京 栃木 4.5 8.5 4.5 2.0 4.5 4.0 5.0
関数は何でもいいらしく、たとえばsumだのdiffだのでもいいし、もっと面白そうなのは関数cを適用すると、
tapply(y, z, c) $茨城 [1] 6 3 $群馬 [1] 9 8 $埼玉 [1] 5 4 $神奈川 [1] 1 3 $千葉 [1] 7 2 $東京 [1] 2 6 $栃木 [1] 3 7
が得られる。つまり、zの要素ごとに、それに合っている納税者を選んで、その納税額をリスト(vector)にしてくれる。
これぞ、図書館貸出データでやりたかったことで、zの要素を日付(たとえば月名)とし、それに合っている貸出レコードを選んで、その図書番号をリストにすることができるはずである。
あらかじめ、
>library("lattice")
としておくこと。
金明哲先生のページ「Rでのデータの視覚化2」の7.三次元グラフ
>data(volcano) >z <- 5 * volcano # 見やすくするため高さを5倍に誇張 >x <- 10 * (1:nrow(z)) # 南北方向の10メートルの格子の辺 >y <- 10 * (1:ncol(z)) # 東西方向の10 メートルの格子の辺 >par(bg = "skyblue") #背景の色設定 >persp(x, y, z, theta = 115, phi = 20, col = "lightgreen", scale = FALSE,ltheta = -120, shade = 0.75, border = NA, box = FALSE)
>data(volcano) >levelplot(volcano)
>image(volcano)
>contour(volcano) または filled.contour(volcano)
> x <- matrix(0,5,5) > x[1,]<-c(1,3,5,3,1) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 3 1 [2,] 0 0 0 0 0 [3,] 0 0 0 0 0 [4,] 0 0 0 0 0 [5,] 0 0 0 0 0 > x[2,]<-c(1,4,6,4,1) > x[3,]<-c(3,6,2,6,3) > x[4,]<-c(2,3,7,3,1) > x[5,]<-c(1,3,6,3,1) > image(x) > levelplot(x)
色を変えるのは結構ややこしいが、次のようにすれば出来るらしい。
色を指定するベクトルを作る。手で作ってもよいはずだが、関数level.colorsを使えば計算で出来る。
> d[1,]<-c(1,1,2,3,2,1,1) > d[2,]<-c(1,2,3,4,3,2,1) > d[3,]<-c(1,3,5,7,5,3,1) > d[4,]<-c(1,4,7,10,7,4,1) > d[5,]<-d[3,] > d[6,]<-d[2,] > d[7,]<-d[1,] > levels <- c(1,2,3,4,5,6,7,8,9,10) > levelplot(d, at = levels, col.regions = heat.colors)
ここでat=levelsはレベルの切れ目で、指定しないとデフォルトは100区分。カラーパレットを変えるには、
> levelplot(d, at = levels, col.regions = topo.colors)
自分用の色を作るには
mycolors <- function(n, alpha = 1) { if ((n <- as.integer(n[1])) > 0) { j <- n%/%4 i <- n - j c(rainbow(i, start = 0, end = 1/6, alpha = alpha), if (j > 0) hsv(h = 1/6, s = seq.int(from = 1 - 1/(2 * j), to = 1/(2 * j), length.out = j), v = 1, alpha = alpha)) } else character(0) }
こんなのも作ってみた
mycolors <- function(n, alpha = 1) { if ((n <- as.integer(n[1])) > 0) { j <- n%/%2 c(hsv(h=4/6, s=seq.int(from=0,to=1,length.out=j), v=1,alpha=alpha), hsv(h=0/6, s=seq.int(from=1/(n-j),to=1,length.out=n-j), v=1,alpha=alpha)) } else character(0) }
ちなみにこれだと、
> data(volcano) > levelplot(volcano, col.regions=mycolors)
とすると、こんな風になる。
もっと別の色を考えよう。
mycolors2 <- function(n, alpha = 1) { if ((n <- as.integer(n[1])) > 0) { c(hsv(h=seq.int(from=4/6,to=0/6,length.out=n), s=seq.int(from=0,to=1,length.out=n), v=1, alpha=alpha)) } else character(0) }
要するに、hsv空間でhueを4/6から0/6に変えながら、同時にstrengthを0から1に変える。