ノート/ノート
ノート/R
訪問者数 2181      最終更新 2010-03-04 (木) 11:49:32

Rを使ってみる (2008-07-07)

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=",")

で出来る。

list, vector, factor, ...

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)

とすると、こんな風になる。

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に変える。

volcano2.png
distribution2.png

添付ファイル: filevolcano2.png 516件 [詳細] filedistribution2.png 461件 [詳細] filevolcano.png 485件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-04 (木) 11:49:32 (2818d)