skype読書会3回目メモ

参加しました。今回はデータのソートなんかと基本的な演算を少々。
あと今回は音声通話なしでチャット形式で進行した。ログを後から見返したり。話の途中でちょっとコーヒーを用意したり、おせんべいを取りに行ったりするのには便利。あと私がよく発言するようになります。
範囲はこれ。

以下ノート。今回は割と流れに沿ったノートをとった。

準備

sales2 <- matrix( c(15, 20, 25, 10 ,30,
                    10, 25, 20, 25, 20),
                 2,
                 5,
                 byrow=T
                 )
colnames(sales2) <- c("Cherry", "Apple", "Grape", "Banana", "Other")
rownames(sales2) <- c("A", "B")

行列の行、列、次元を求める

> nrow(sales2)
[1] 2
> ncol(sales2)
[1] 5
> dim(sales2)
[1] 2 5

データセットの結合

rbindやcbindを使う。

> rbind(sales2, c(20,30,15,20,15))
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    20     25    20
      20    30    15     20    15
> A <- matrix(c(1,2,1,4),2,2)
> B <- matrix(c(4,2,3,4),2,2)
> rbind(A,B)
     [,1] [,2]
[1,]    1    1
[2,]    2    4
[3,]    4    3
[4,]    2    4
> cbind(A,B)
     [,1] [,2] [,3] [,4]
[1,]    1    1    4    3
[2,]    2    4    2    4

データフレーム、行列同士の場合は行数(cbindなら列数)が一致している必要がある。

> rbind(sales2, matrix(1:4,2,2))
Error in rbind(sales2, matrix(1:4, 2, 2)) : 
  number of columns of matrices must match (see arg 2)

結合するものがベクトルの場合は例の繰り返し規則が適用される。

> rbind(sales2, 1:3)
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    20     25    20
       1     2     3      1     2
Warning message:
In rbind(sales2, 1:3) :
  number of columns of result is not a multiple of vector length (arg 2)

データセットの並び換え

ベクトルなどはsort()で並び換え。デフォルトは昇順。

> sort(c(3,2,4,1))
[1] 1 2 3 4

降順にしたいときはdecreasingにTRUEを指定。

> sort(c(3,2,4,1), decreasing=TRUE)
[1] 4 3 2 1
> sort(c(3,2,4,1), dec=T) #多分一意に定まるのであれば引数は省略できる
[1] 4 3 2 1
> sort(c(3,2,4,1), d=T)   #これはエロい byやぐさん
[1] 4 3 2 1
> sort(c(3,2,4,1), T)     #順番が合ってれば引数名は省略できる
[1] 4 3 2 1

index.returnにTRUEを指定するとindexを返してくれる。これはorder()で返ってくるものと同じ。

> sort(c(3,2,4,1), index.return=T)
$x
[1] 1 2 3 4
$ix
[1] 4 2 1 3
> sort(c(3,2,4,1), i=T)
$x
[1] 1 2 3 4
$ix
[1] 4 2 1 3
> order(c(3,2,4,1))
[1] 4 2 1 3

orderの返り値は、その順番(order)に存在する値の位置(index)。つまり、orderの返り値を元のベクトルに添字として与えることは元のベクトルを昇順にsortすることと同じ。

> a <- c(1,4,2,3)
> a.order <- order(a)
> a[a.order]
[1] 1 2 3 4
> sort(a)
[1] 1 2 3 4

orderと似たような関数にsort.listがある。単一のベクトルを与えた場合の結果は同じ。

> a <- c(1,4,2,3)
> sort.list(a)
[1] 1 3 4 2
> order(a)
[1] 1 3 4 2

ただしorderは複数のベクトルを引数にとることができ、1つめのベクトルで同順位だった場合に2つめのベクトルで判定する。

> a <- c(1,1,3,3,2,2)
> b <- c(2,1,2,1,2,1)
> order(a,b)
[1] 2 1 6 5 4 3

部分ソート (by「Rプログラミングマニュアル」)

data(swiss)
x <- swiss$Education[1:26]
x
sort(x)
# 10番目の大きさの値より小さなものを左、15番目の値より大きなものを右に
# 少ない計算量で大ざっぱに分ける感じ?
sort(x,partial=c(10,15))

(順位を求めるのに必要な計算量とかはどうなってるんだろうか。よくわからない。)

ベクトルの並びを逆転させるにはrev()

> rev(c(3,2,4,1))
[1] 1 4 2 3

dataframeとmatrixが見分けられないとき

class()を使いましょう。

> sales2
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    20     25    20
> data.frame(sales2)
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    20     25    20
> class(sales2)
[1] "matrix"
> class(data.frame(sales2))
[1] "data.frame"

算術演算

加算、減算、乗算、除算、べき、商、余り

 + - * / ^ %/% %%

ベクトルの他にもデータフレームやマトリックスにも使えるよ!
(%% は if(x %% 2 ==0) foo とかいう感じで偶数の判定なんかによくつかう)

比較演算

よくあるやつ

 > >= < <= == !=

ベクトルに使うと論理値ベクトルが返ってくるので

> x <-  1:5
> x < 3
[1]  TRUE  TRUE FALSE FALSE FALSE

これを添字にすると条件を見たす要素だけを抜き出せる。べんり。

> x[x < 3]
[1] 1 2

論理演算

これもよくあるやつ。ただし"^"はべきで使っているのでxorは関数。

 ! & && | || xor()

&, |と&&, ||の違いはベクトルを与えられた場合前者がすべての要素を比較するのに対し後者は左から比較して演算が成立したらそこでやめる点にある。

> Lx
[1] FALSE FALSE  TRUE  TRUE
> Ly
[1]  TRUE FALSE  TRUE FALSE
> Lx & Ly
[1] FALSE FALSE  TRUE FALSE
> Lx && Ly
[1] FALSE

なので && や || はifやwhileなど長さが2以上になったら困るようなモノに使うとよい。

行列の演算

そのまま*使うと要素ごとの積になるので%*%を使いましょう。

> A <- matrix(c(1,2,1,4),2,2)
> B <- matrix(c(4,2,3,4),2,2)
> A * B
     [,1] [,2]
[1,]    4    3
[2,]    4   16
> A %*% B
     [,1] [,2]
[1,]    6    7
[2,]   16   22

あとはなんだかよくわからないので線形代数の勉強をしましょう。
ちょっと単位行列が欲しいときは

> diag(3)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

ちょっとなごみたいときは

> diag(0)
<0 x 0 matrix>

 「「
<0 x 0>