[[ノート/ノート]]~
[[ノート/R]]~
訪問者数 &counter();      最終更新 &lastmod();

**Rを使ってみる (2008-07-07)[#i573517e]
Rに関する覚書きメモ

参考になるサイト~
 > [[同志社 金明哲先生のページ;http://www1.doshisha.ac.jp/~mjin/R/]]~
  >> 特に[[基本統計量:http://www1.doshisha.ac.jp/~mjin/R/toukeiryou.html]] [[関数:http://www1.doshisha.ac.jp/~mjin/R/04.html]] 
[[視覚化1:http://www1.doshisha.ac.jp/~mjin/R/05.html]] 
[[視覚化2:http://www1.doshisha.ac.jp/~mjin/R/06.html]] 
[[視覚化3:http://www1.doshisha.ac.jp/~mjin/R/07.html]]~
 > [[阪大RWikiの貢献パッケージリスト:http://www.okada.jp.org/RWiki/index.php?CRAN%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A5%EA%A5%B9%A5%C8]]~
 > [[RjpWiki:http://www.okada.jp.org/RWiki/?RjpWiki]]~
 > [[船尾さんのR-tips:http://cse.naro.affrc.go.jp/takezawa/r-tips.pdf]]~
 > [[統計処理ソフト R 入門 講習会資料:http://androids.happy.nu/ja/r-intro-lecture]]~

***プログラム(スクリプトファイルの実行) [#a5679bcc]
Rはインタラクティブに使えるが、スクリプトファイルを実行する形でも使える。
 source("スクリプトのファイル名")
ファイル名の拡張子は .R

ファイルの所在は、Current Directoryの概念があって、「ファイル」⇒「ディレクトリの変更」で設定・選択できる。~
コマンドから設定する方法は?

***入出力 [#x28020d2]
コンマ区切りの表(たとえばExcelのCSVデータなど)は、
 x <- read.table("ファイル名", sep=",")
で読める。但しファイルはCurrent Directoryにあること。

CSVだと分かっていれば、x <= read.csv("ファイル名")でOK

書き出しも
 write.table(x, file="ファイル名", sep=",")
で出来る。

***list, vector, factor, ... [#w78f8a58]
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の要素を日付(たとえば月名)とし、それに合っている貸出レコードを選んで、その図書番号をリストにすることができるはずである。

***頻度を測りたい [#m3e5b78e]


***等高線グラフを描く [#i97d4de1]
あらかじめ、
 >library("lattice")
としておくこと。~

[[金明哲先生のページ「Rでのデータの視覚化2」:http://www1.doshisha.ac.jp/~mjin/R/06.html]]の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)
とすると、こんな風になる。
#ref(volcano.png);
もっと別の色を考えよう。
 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に変える。
#ref(volcano2.png);
#ref(distribution2.png);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS