Rチートシート

#概要

Rを初めて使ったので簡単にまとめてみた

#Rの基本

```R
> c(1,2,3,4,5)   #cを表示
[1] 1 2 3 4 5
> x <- c(1,2,3,4,5) #xに代入
> x     #xを表示
[1] 1 2 3 4 5
> mean(x)    #xの平均を出す
[1] 3
> mean(log(x))    #xの対数の平均をとる
[1] 0.9574983
```

#ファイル操作
```R
> getwd() #カレントディレクトリの表示
[1] "/Users/Tomoki"
> setwd("~/workspace/R") #カレントディレクトリの変更
> getwd() #カレントディレクトリの表示
[1] "/Users/Tomoki/workspace/R"
> cat("abc", file = "a.txt") #内容がabcのa.txtを作成
```

#ベクトル

| Cherry | Apple | Grape | Banana | Other |
|:-:|:-:|:-:|:-:|:-:|
| 15  | 20  | 25  | 10  | 30  |

上記のような表をRで作る

```R
> sales <- c(15, 20, 25, 10, 30)
> length(sales)   #salesの長さを表示
[1] 5
> fruits <- c("Cherry","Apple","Grape","Banana","Other")
> names(sales) <- fruits #fruitsをsalseのラベルにする
> sales    #salseを表示
Cherry  Apple  Grape Banana  Other 
    15     20     25     10     30 
```

#行列

|  | Cherry | Apple | Grape | Banana | Other |
|:-:|:-:|:-:|:-:|:-:|:-:|
| A | 15  | 20  | 25  | 10  | 30  |
| B | 10  | 25  | 20  | 25  | 20  |


```R
> sales2 <- matrix(0, 2, 5) #各要素0の2行5列の行列をsales2に代入
> sales2[1,] <- c(15,20,25,10,30) #1行目に代入
> sales2[2,] <- c(10,25,20,25,20) #2行目に代入
> sales2  #sales2を表示
     [,1] [,2] [,3] [,4] [,5]
[1,]   15   20   25   10   30
[2,]   10   25   20   25   20
> dim(sales2) #行列のサイズを表示
[1] 2 5
> sales2[2, 3] <- 30 #2行3列の要素20を30に置き換える
> colnames(sales2) <- fruits #列に名前をつける
> rownames(sales2) <- c("A", "B") #行に名前をつける
> sales2  #sales2を表示
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    30     25    20 
```

#配列(分割表)

```R
> array(1:30, c(2,5,3))#1~30を2×5の表3つに分割する
, , 1

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

, , 2

     [,1] [,2] [,3] [,4] [,5]
[1,]   11   13   15   17   19
[2,]   12   14   16   18   20

, , 3

     [,1] [,2] [,3] [,4] [,5]
[1,]   21   23   25   27   29
[2,]   22   24   26   28   30
```

#リスト

リストは、ベクトル、行列、配列、リストなど異なる型を一つのオブジェクトとして扱うことが可能である

```R
> L1 <- list(c(1:8), c("A", "B"), matrix(1:12, 2, 6))
> L1[1]　#c(1:8)を表示
[[1]]
[1] 1 2 3 4 5 6 7 8

> L1[2] #c("A", "B")を表示
[[1]]
[1] "A" "B"

> L1[3] #matrix(1:12, 2, 6)を表示
[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    5    7    9   11
[2,]    2    4    6    8   10   12
```

#データフレーム

```R
> name <- c("ichiro", "jiro", "saburo", "shiro")
> english <- c("45", "79", "89", "51")
> score <- data.frame(name, math, english) 
> score
    name math english
1 ichiro   80      45
2   jiro   32      79
3 saburo   68      89
4  shiro   90      51
> score[c("name")] # nameのみ取り出し
    name
1 ichiro
2   jiro
3 saburo
4  shiro
> score$name # 列の参照
[1] "ichiro" "jiro"   "saburo" "shiro"
> with(score, math[name == "saburo"]) # 特定の値の参照
[1] "68"
```

#ファイル読み込み

## read.tabel

```R
> getwd()  #カレントディレクトリの表示
[1] "/Users/Tomoki/workspace/R"
> cat("  Cherry Apple Grape Banana Other
+ A     15    20    25     10    30
+ B     10    25    30     25    20 ", file = "data1.txt") # data1.txtを作成
> data1<- read.table("./data1.txt", header = T, row.names = 1)
Warning message:
In read.table("./data1.txt", header = T, row.names = 1) :
  incomplete final line found by readTableHeader on './data1.txt'
> data1
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    30     25    20
```

read.tableは以下のscanと比べると効率が悪い。

##scan

以下のようなdata2.txtを作成する

```txt:data2.txt
1 2 3
4 5
6 7 8 9 5 2 1
```


```R
> cat("1 2 3
+ 4 5
+ 6 7 8 9 5 2 1", file = "data2.txt") #data2.txtを作成
> scan("./data2.txt")
Read 12 items
 [1] 1 2 3 4 5 6 7 8 9 5 2 1
> matrix(scan("./data2.txt"),3,4)
Read 12 items
     [,1] [,2] [,3] [,4]
[1,]    1    4    7    5
[2,]    2    5    8    2
[3,]    3    6    9    1
> data2 <- scan("./data2.txt")
Read 12 items
> data2.M <- matrix(data2, 3, 4, byrow = T)
> data2.M
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9    5    2    1
```

##read.delim

Excelのコピーなどクリップボードデータの読み込みをする

```R
> x <- read.delim("clipboard", header = F)
```

#データの編集

```R
> nrow(sales2) #行数を表示
[1] 2
> ncol(sales2) #列数を表示
[1] 5
> dim(sales2) #次元を表示
[1] 2 5
> rbind(sales2, c(20, 30, 15, 20, 15)) #行の追加
  Cherry Apple Grape Banana Other
A     15    20    25     10    30
B     10    25    30     25    20
      20    30    15     20    15
```

2つの行列A, Bを定義する。

```math
A = 
\begin{pmatrix}
1 & 1 \\
2 & 4
\end{pmatrix}
\quad B = 
\begin{pmatrix}
4 & 3 \\
2 & 4
\end{pmatrix}
```

```R
> #行列Aを作成
> A <- matrix(0, 2, 2) 
> A[1,]<- c(1,1)
> A[2,] <- c(2,4)

> #行列Bを作成
> B <- matrix(0,2,2)
> B[1,] <- c(4,3)
> B[2,] <- c(2,4)

>#Aの下にBを追加
> rbind(A, B) 
     [,1] [,2]
[1,]    1    1
[2,]    2    4
[3,]    4    3
[4,]    2    4

> #Aの右にBを追加
> cbind(A, B)
     [,1] [,2] [,3] [,4]
[1,]    1    1    4    3
[2,]    2    4    2    4
```

#データの整列

```R
> sort(c(3, 2, 4, 1)) #昇順に並び替え
[1] 1 2 3 4
> rev(c(3, 2, 4, 1)) #逆順に並び替え
[1] 1 4 2 3
> sales2[,sort.list(sales2[1,])] #1行目を並び替え
  Banana Cherry Apple Grape Other
A     10     15    20    25    30
B     25     10    25    30    20
```

#データの演算

##算術演算
```R
> x <- c(1, 2, 3, 4)
> y <- c(4, 2, 3, 1)
> x + y
[1] 5 4 6 5
> x - y
[1] -3  0  0  3
> x * y
[1] 4 4 9 4
> x / y
[1] 0.25 1.00 1.00 4.00
> x ^ 2
[1]  1  4  9 16
> x %/% 2  #商
[1] 0 1 1 2
> x %% 2  #余り
[1] 1 0 1 0
```

##比較演算

```R
> x > y
[1] FALSE FALSE FALSE  TRUE
> x >= y
[1] FALSE  TRUE  TRUE  TRUE
> x != y
[1]  TRUE FALSE FALSE  TRUE
> x == y
[1] FALSE  TRUE  TRUE FALSE
```

##論理演算

```
> Lx <- c(T, T, F, F)
> Ly <- c(T, F, F, T)
> !(Lx)  #NOT
[1] FALSE FALSE  TRUE  TRUE
> Lx & Ly  #AND
[1]  TRUE FALSE FALSE FALSE
> Lx && Ly #AND
[1] TRUE
> Lx | Ly  #OR
[1]  TRUE  TRUE FALSE  TRUE
> Lx || Ly #OR
[1] TRUE
> xor(Lx,Ly)  #XOR
[1] FALSE  TRUE FALSE  TRUE
```

##行列の演算

```R
> A + B
     [,1] [,2]
[1,]    5    4
[2,]    4    8
> A - B
     [,1] [,2]
[1,]   -3   -2
[2,]    0    0
> A * B
     [,1] [,2]
[1,]    4    3
[2,]    4   16
> 2 * A
     [,1] [,2]
[1,]    2    2
[2,]    4    8
>
> D <- matrix(0, 2, 3)
> D[1,] <- c(4, 3, 2)
> D[2,] <- c(2, 4, 1)
> A %*% D  #行列の積演算
     [,1] [,2] [,3]
[1,]    6    7    3
[2,]   16   22    8
>
> A
     [,1] [,2]
[1,]    1    1
[2,]    2    4
> solve(A)  #Aの逆行列を表示
     [,1] [,2]
[1,]    2 -0.5
[2,]   -1  0.5
> A %*% solve(A) #AとAの逆行列の積
     [,1] [,2]
[1,]    1    0
[2,]    0    1
> solve(A) %*% A #Aの逆行列とAの積
     [,1] [,2]
[1,]    1    0
[2,]    0    1
> 
> A <- matrix(c(1, 2, 1, 4), 2, 2) #Aを定義
> A
     [,1] [,2]
[1,]    1    1
[2,]    2    4
> eigen(A) #Aの固有値と固有ベクトルを表示
$values
[1] 4.5615528 0.4384472

$vectors
           [,1]       [,2]
[1,] -0.2703230 -0.8719282
[2,] -0.9627697  0.4896337
>
> #lamudaにAの固有値を代入
> lamuda = eigen(A)$values
> #XにAの固有ベクトルを代入
> X = eigen(A)$vectors
> A %*% X[,1]
          [,1]
[1,] -1.233093
[2,] -4.391725
> lamuda[1] * X[,1]
[1] -1.233093 -4.391725
```

#基本統計量

```R
> uriage <- c(12, 6, 13, 7, 8, 11, 12, 9, 10, 7)
> sum(uriage) #uriageの合計
[1] 95
> uriage / sum(uriage) #比率
 [1] 0.12631579 0.06315789 0.13684211 0.07368421 0.08421053
 [6] 0.11578947 0.12631579 0.09473684 0.10526316 0.07368421
> 100 * (uriage / sum(uriage))  #百分率
 [1] 12.631579  6.315789 13.684211  7.368421  8.421053 11.578947
 [7] 12.631579  9.473684 10.526316  7.368421
> round(100 * (uriage / sum(uriage)), 2) # 四捨五入する
 [1] 12.63  6.32 13.68  7.37  8.42 11.58
 [7] 12.63  9.47 10.53  7.37
> mean(uriage) #平均
[1] 9.5
>
> table(c(1, 5, 4, 3, 3)) #出現頻度を数える

1 3 4 5 
1 2 1 1 
> median(c(2, 3, 3, 4, 5, 7)) #中央値を求める
[1] 3.5
> max(uriage) #最大値
[1] 13
> min(uriage) #最小値
[1] 6
> range(uriage) #範囲
[1]  6 13
>
> P <- c(7206, 6358, 9809, 8915, 7850, 8965)
> Q <- c(5550, 4880, 15914, 4856, 13013, 4890)
>
> #分散
> var(P)
[1] 1637453
> var(Q)
[1] 24570507
>
> #標準分散
> sd(P)
[1] 1279.63
> sd(Q)
[1] 4956.865
> sqrt(var(P)) # 分散の平方根
[1] 1279.63
>
> # 相関関数
> cor(P, Q)
[1] 0.4588443
>
> #Pの散布図
> plot(1:6,Ash,pch=21,bg=2,col=2,cex=2,ylim=range(Bshi))
> abline(mean(Bshi),0,lw=2,col=3)
> #Qの散布図
> plot(1:6,Bshi,pch=21,bg=2,col=2,cex=2,ylim=range(Bshi))
> abline(mean(Bshi),0,lw=2,col=3)
>
> #四分位数
> quantile(c(3,5,6,8,9,11,12,15,16))
  0%  25%  50%  75% 100% 
   3    6    9   12   16 
> #四分位偏差
> IQR(c(3,5,6,8,9,11,12,15,16))
[1] 6
> #要約
> summary(c(3,5,6,8,9,11,12,15,16))
   Min. 1st Qu.  Median    Mean 3rd Qu. 
  3.000   6.000   9.000   9.444  12.000 
   Max. 
 16.000 
```