class: center, middle, inverse, title-slide # R Club - Lesson 2 ##
http://s.opur.club/18d2
### Kenji Sato ### 2018/10/17 & 24 --- $$\let\oldhat\hat \renewcommand{\hat}[1]{\oldhat{\hspace{0pt} #1}}$$ <div style="margin-top: -2.5em"></div> ## 本日の目標 こういう形のデータをR で扱えるようになります。 ``` Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa ``` --- ## 本日の目標 - オブジェクト・ベクトル - 名前 - ベクトルに対する操作 - データフレームと tibble - CSV / Excel --- ## 本日の目標 - **オブジェクト・ベクトル** - 名前 - ベクトルに対する操作 - データフレームと tibble - CSV / Excel --- ## オブジェクト オブジェクトには以下のようなものがあります。私たちが何らかの操作をしようとする「対象」となるものです。 - 数・文字列などのベクトル - 表形式データ - 行列 - リスト - 関数 --- ## オブジェクトの型 R で最も基本となるオブジェクトは,数値・文字列とそれを並べたベクトルです。 `typoeof()` 関数が型=種類を示します。 .pull-left[ ```r > typeof(100) ``` ``` ## [1] "double" ``` ```r > typeof("RClub") ``` ``` ## [1] "character" ``` ```r > typeof(50L) ``` ``` ## [1] "integer" ``` ] .pull-right[ ```r > typeof(-3 + 1i) ``` ``` ## [1] "complex" ``` ```r > typeof(TRUE) ``` ``` ## [1] "logical" ``` ```r > typeof(FALSE) ``` ``` ## [1] "logical" ``` ] --- ## ベクトルの型 ベクトルでない単一の数・文字列というものは R にはありません。したがって,`c()` で生成されるベクトルに `typeof()` を適用すると要素の共通の型が示されます。 ```r > typeof(c(1, 2, 3)) ``` ``` ## [1] "double" ``` ```r > typeof(c("Hello", "RClub")) ``` ``` ## [1] "character" ``` ```r > typeof(c(TRUE, FALSE)) ``` ``` ## [1] "logical" ``` --- ## 暗黙の型変換 ベクトルの要素はすべて同一の型をもっています。次のコードで実験してみましょう。 何が起こるかの予想をたててから,コードを実行してください ```r > c(3, TRUE, FALSE) > c("1", TRUE, FALSE) > c(1, "Two") > c(10L, 5) # 10L は整数の 10 > c(30, 3 + 1i) ``` --- ## ベクトルを生成する便利な関数 ベクトルを生成するには, `c()` 以外にもたくさんの方法があります。 次の各コードが何をするか,予想をたててから実行してください ```r > double(10) > integer(5) > character(2) > logical(3) > 1:10 > seq(-2, 2, by = 0.5) > seq(-2, 2, length.out = 5) ``` --- ## 本日の目標 - オブジェクト・ベクトル - **名前** - ベクトルに対する操作 - データフレームと tibble - CSV / Excel --- ## 名付け `<-` を使って名前を付けます。(代わりに `=` を使うこともできます。1つのプロジェクトに両方を使わないように) ```r > numbers <- 1:10 > numbers ``` ``` ## [1] 1 2 3 4 5 6 7 8 9 10 ``` `->` という逆向きの矢印を使うこともできます。 ```r > 1:10 -> numbers2 > numbers2 ``` ``` ## [1] 1 2 3 4 5 6 7 8 9 10 ``` --- ## よくあるエラー 次のコードは何が問題でしょうか? ```r > new_number < - 10 ``` ``` ## Error in eval(expr, envir, enclos): object 'new_number' not found ``` ```r > 3<-5 ``` ``` ## Error in 3 <- 5: invalid (do_set) left-hand side to assignment ``` -- [Alt] + [-] のショートカットキーを使いましょう。 --- ## 名前 オブジェクトには名前を付けることができます。 基本的なルールは次の通りです。 - 文字と数字と `.`, `_` のみで構成されていること - 最初の文字は数字や `_` であってはならない - `TRUE`/`FALSE`, `NULL`, `NA`, `if`, `function` などの予約語でないこと --- ## クイズ 次のコマンドはどれがエラーになると思いますか? <pre><code class="r hljs remark-code"><div class="remark-code-line">> . <- 100 > _x <- 100 > 2b <- 1:10 > TRUE <- FALSE > 大学 <- "大阪府立大学" > `2018` <- 540 </div></code> </pre> --- ## 本日の目標 - オブジェクト・ベクトル - 名前 - **ベクトルに対する操作** - データフレームと tibble - CSV / Excel --- ## ベクトルの演算 ```r > x <- 0:10 > y <- seq(0, 1, by = 0.1) ``` ```r > x + y # 加 > x - y # 減 > x * y # 乗 > x / y # 除 ``` ```r > log(x) > exp(y) ``` 片方の数が少ない場合は長い方に合わせて引き伸ばします。 ```r > 3 * x ``` --- ## 比較 ```r > x < 5 ``` ``` ## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE ## [10] FALSE FALSE ``` ```r > x < 3 | x > 6 # OR ``` ``` ## [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE ## [10] TRUE TRUE ``` ```r > x < 3 & x > 6 # AND ``` ``` ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE ## [10] FALSE FALSE ``` --- ## 文字列関数 ```r > paste("Hello,", c("Alice", "Bob", "Charlie"), "!") ``` ``` ## [1] "Hello, Alice !" "Hello, Bob !" "Hello, Charlie !" ``` ```r > paste0("Group-", LETTERS) ``` ``` ## [1] "Group-A" "Group-B" "Group-C" "Group-D" "Group-E" ## [6] "Group-F" "Group-G" "Group-H" "Group-I" "Group-J" ## [11] "Group-K" "Group-L" "Group-M" "Group-N" "Group-O" ## [16] "Group-P" "Group-Q" "Group-R" "Group-S" "Group-T" ## [21] "Group-U" "Group-V" "Group-W" "Group-X" "Group-Y" ## [26] "Group-Z" ``` ```r > sub("ery", "erry", c("Apple", "Bluebery", "Chery")) ``` ``` ## [1] "Apple" "Blueberry" "Cherry" ``` --- ## 条件による抽出 ```r > fruit <- stringr::fruit # フルーツの名前のベクトル > head(fruit) # 最初の6個を表示 ``` ``` ## [1] "apple" "apricot" "avocado" "banana" ## [5] "bell pepper" "bilberry" ``` -- ```r > is_berry <- endsWith(fruit, "berry") # berry で終わる名前か > head(is_berry) ``` ``` ## [1] FALSE FALSE FALSE FALSE FALSE TRUE ``` -- ```r > berries <- fruit[is_berry] # TRUE の部分のみ抽出 > head(berries) ``` ``` ## [1] "bilberry" "blackberry" "blueberry" "boysenberry" ## [5] "cloudberry" "cranberry" ``` --- ## 集約関数 ```r > x ``` ``` ## [1] 0 1 2 3 4 5 6 7 8 9 10 ``` ```r > sum(x) # 合計 ``` ``` ## [1] 55 ``` ```r > mean(x) # 平均 ``` ``` ## [1] 5 ``` ```r > var(x) # 不偏分散 ``` ``` ## [1] 11 ``` --- ## クイズ TRUE は 1, FALSE は0 だったことを思い出す。 ```r > head(is_berry) # is_berry は berry で終わる果物なら TRUE ``` ``` ## [1] FALSE FALSE FALSE FALSE FALSE TRUE ``` 次は何を計算している? ```r > sum(is_berry) ``` ``` ## [1] 14 ``` ```r > mean(is_berry) ``` ``` ## [1] 0.175 ``` --- ## 要素の抽出 `[]` を使います。インデックスは 1 から始まります。 ```r > x[1] > x[2] > berries[10] ``` 複数のインデックスを付けることもできます。 ```r > berries[c(3, 7, 10)] ``` ``` ## [1] "blueberry" "elderberry" "huckleberry" ``` --- ## オブジェクトの保存 `saveRDS()` を使って,後日作業を再開するときのためにデータを保存できます。 ```r > saveRDS(x, file = "Data/x.rds") ``` 作業再開時には `readRDS()` を使います。 ```r > x <- readRDS("Data/x.rds") ``` `dump()` の使用について [こちら](https://opur.club/textbook/2018-2-1/#save-objects) を確認してください。 --- ## 本日の目標 - オブジェクト・ベクトル - 名前 - ベクトルに対する操作 - **データフレームと tibble** - CSV / Excel --- ## データフレーム = 表形式データ ```r > score <- data.frame( + Name = c("Alice", "Bob", "Charlie"), + Econ = c(90, 80, 100), + Math = c(100, 90, 60) + ) > score ``` ``` ## Name Econ Math ## 1 Alice 90 100 ## 2 Bob 80 90 ## 3 Charlie 100 60 ``` <table> <thead> <tr> <th style="text-align:left;"> Name </th> <th style="text-align:right;"> Econ </th> <th style="text-align:right;"> Math </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Alice </td> <td style="text-align:right;"> 90 </td> <td style="text-align:right;"> 100 </td> </tr> <tr> <td style="text-align:left;"> Bob </td> <td style="text-align:right;"> 80 </td> <td style="text-align:right;"> 90 </td> </tr> <tr> <td style="text-align:left;"> Charlie </td> <td style="text-align:right;"> 100 </td> <td style="text-align:right;"> 60 </td> </tr> </tbody> </table> --- ## データフレームの各列はベクトル ![](https://dev.opur.club/images/2018-2-2-1.jpeg) --- ## 切り出し 次の各コマンドが何をしているかを確認してください。 ```r > score[1] > score["Name"] > score$Name > score[, 2] > score[score$Name == "Alice", ] > score[1, 2] > score$Name[3] > score[score$Name == "Bob", "Econ"] ``` --- ## 列の追加 個人ごとに全教科の平均を求めます。 ```r > (avg_score <- rowMeans(score[c("Econ", "Math")])) ``` ``` ## [1] 95 85 80 ``` 平均得点を列として追加します。(dplyr を使ってもっと簡単にする方法は次回学びます) ```r > score$Avg <- avg_score > score ``` ``` ## Name Econ Math Avg ## 1 Alice 90 100 95 ## 2 Bob 80 90 85 ## 3 Charlie 100 60 80 ``` --- ## tibble data.frame を改良した表形式データ。**tidyverse** パッケージ(あるいは **tibble** パッケージ)を読み込んで使う。 ```r > library(tidyverse) > scr <- tibble( + Name = c("Alice", "Bob", "Charlie"), + Econ = c(90, 80, 100), + Math = c(100, 90, 60) + ) > scr ``` ``` ## # A tibble: 3 x 3 ## Name Econ Math ## <chr> <dbl> <dbl> ## 1 Alice 90 100 ## 2 Bob 80 90 ## 3 Charlie 100 60 ``` --- ## 1つの違い ```r > score[, 2] ``` ``` ## [1] 90 80 100 ``` ```r > scr[, 2] ``` ``` ## # A tibble: 3 x 1 ## Econ ## <dbl> ## 1 90 ## 2 80 ## 3 100 ``` data.frame の上記振る舞いを前提にしている関数は tibble では動かないかも。その場合は,`as.data.frame()` で変換 --- ## 本日の目標 - オブジェクト・ベクトル - 名前 - ベクトルに対する操作 - データフレームと tibble - **CSV / Excel** --- ## 外部とのデータのやり取り 自分でデータを入力する必要がある場合は - CSV, Excel を使ってデータ入力 - R で統計分析 という分業が標準的だと思われる。 という訳で,R のネイティブなデータ形式(RDS 形式)ではなく,CSV/Excel との間でデータのやり取りをする方法を覚える必要がある。 --- ## readr と readxl - CSV の読み込みは `readr::read_csv()` など - Excel ファイルの読み込みは `readxl::read_excel()` など - CSV への書き出しは `readr::write_csv()`, `readr::write_excel_csv()` --- ## 課題 - [Lesson 2-1: R のベクトル](https://opur.club/textbook/2018-2-1/) - [Lesson 2-2: データフレーム・tibble](https://opur.club/textbook/2018-2-2/) にはスライドで扱っていない内容,練習問題を含んでいます。 読んで練習問題を実行してみてください。 --- ## 全部終わった人への課題 [Maddison プロジェクト](https://www.rug.nl/ggdc/historicaldevelopment/maddison/releases/maddison-project-database-2018) の Excel ファイルをダウンロードしてください。 そして,西暦 500 年以降の日本の実質GDPをプロットするコードを書いてください。 ヒント (DL済みとして) ```r mpd <- ______("Data/mpd2018.xlsx", sheet = 2) japan <- mpd[__________ == "Japan", ] japan500 <- japan[________ >= 500, ] plot(japan500$year, __________, type = "l") ```