第一回ではRの基礎知識(基本操作、オブジェクト)、基本とデータの読み込み(四則演算、パッケージの呼び出し、データの読み込み)、データフレームの整形(様々な関数)について学習します。
R言語とは統計解析、グラフの作成などを得意とする言語です。美しいグラフを作成することが可能で、似たようなグラフを繰り返し作成するときなどに非常に便利です。
RstudioとはRを使用するための統合開発環境(IDE: Integrated Development Environment)です。
RおよびRstudioのインストールに関しては、別ファイルを参照してください。Rのバージョンによっては動かないパッケージも存在するので、注意してください。 GAMSゼミで設定したように、Rにパスを設定しておくとコマンドプロンプトなどからの操作も可能となりますが、今回は不要です。
Rstudioを起動し、FileのNew Projectから新しいプロジェクトを作成します。GAMSと同様にディレクトリの位置に注意する必要があります。 既に作成済みのプロジェクトを使用する場合は、Open Projectあるいは、エクスプローラーから直接開きます。
プロジェクトを開いた後、実際のコーディングを行うR scriptファイルを作成します。プロジェクトに関連付けておくと開きやすく便利です。
すべてを実行する場合は
スクリプトをセクションごとに分割することができる。Ctrl+Shift+Rで新規セクションを追加し、Ctrl+Alt+Tでセクションごとに実行することができる。
.Rdataファイルの保存をすると再度使用する際に、前回のデータを読み込んでしまい、ミスにつながる可能性がある。Tools>Options>Generalで、Save workspace to RData on exitをNeverにしておくとよい。
他人が書いたスクリプトを使用すると、文字化けすることがよくある。エンコードの違いが原因なので、File>Reopen with Encoding…からShift-JISやUTF-8などを選択すると直る。 Tools>Global Options…>Code>Save>Encodingでエンコードをデフォルトで指定しておくとよい。
install.packages(パッケージ名)でインストールが可能。インストール方法は別紙参照。library('パッケージ名')でパッケージを呼び出すことができます。 Packagesからチェックで呼び出すことも可能ですが、library()による呼び出しを推奨します。
library(gdxrrw)
library(tidyverse)オブジェクトへの代入が=ではなく<-である点に注意が必要。#でコメントアウトが可能です。
x <- 3 #substitute 3 for x
y <- x #substitute x for y
y <- y + x**2/4 #substitute y+x^2 for y
x <- 4 #substitute 4 for x実行後のデータは右上のEnvironmentやコンソールから確認することができます。
y # Enter y in console## [1] 5.25
オブジェクトにベクトルを代入してみましょう。ベクトルはc(要素1,要素2,...)のように表現します。
x <- c(1,2,3,4,5) #make vector x
y <- c(5,4,3,2,1) #make vector y(x,y)という座標をプロットして結果を確認してみましょう。
plot(x,y)まずは直接入力してデータフレームを作成してみましょう。ベクトルa,b,c,dを作成します。
a <- c("apple","orange","grape","apple","orange") #make each vector
b <- c("ringo","mikan","budou","ringo","mikan") #in Japanese
c <- c(230,110,170,180,90)
d <- c(T,T,T,F,T)続いて、これらのベクトルを結合することでデータフレームdfを作成します。
df <- data.frame(a,b,c,d) #bind each vector
df <- data.frame(name=a,japanese=b,weight=c,damage=d) #with name作成したデータフレームを確認するために、view(df),str(df),summary(df)を実行しましょう。view()でデータの確認、str()で型の確認、summary()で各統計量が確認できます。
view(df) #view data frame| name | japanese | weight | damage |
|---|---|---|---|
| apple | ringo | 230 | TRUE |
| orange | mikan | 110 | TRUE |
| grape | budou | 170 | TRUE |
| apple | ringo | 180 | FALSE |
| orange | mikan | 90 | TRUE |
str(df) #check data type## 'data.frame': 5 obs. of 4 variables:
## $ name : chr "apple" "orange" "grape" "apple" ...
## $ japanese: chr "ringo" "mikan" "budou" "ringo" ...
## $ weight : num 230 110 170 180 90
## $ damage : logi TRUE TRUE TRUE FALSE TRUE
summary(df) #check data information## name japanese weight damage
## Length:5 Length:5 Min. : 90 Mode :logical
## Class :character Class :character 1st Qu.:110 FALSE:1
## Mode :character Mode :character Median :170 TRUE :4
## Mean :156
## 3rd Qu.:180
## Max. :230
filter()は特定行を、select()は特定列を抽出する際に使用します。 dfは10都道府県の地域区分、人口、面積に関するデータです。
| Prefecture | Area | Population | Landarea |
|---|---|---|---|
| Hokkadio | Hokkaido | 5267762 | 83424 |
| Miyagi | Touhoku | 2292385 | 7282 |
| Tokyo | Kantou | 13834925 | 2191 |
| Kanagawa | Kantou | 9209442 | 2416 |
| Aichi | Chubu | 7575530 | 5172 |
| Kyoto | Kansai | 2545899 | 4612 |
| Osaka | Kansai | 8849635 | 1905 |
| Hyogo | Kansai | 5549568 | 8401 |
| Hiroshima | Chugoku | 2826858 | 8479 |
| Hukuoka | Kyusyu | 5129841 | 4986 |
まずはfilter()を使用して、dfから関東、関西、中部地方のデータを抽出してみましょう。 第一引数に対象とするデータ、第二引数に条件式を指定します。
df1 <- filter(df, Area %in% c("Kantou","Kansai","Chubu"))| Prefecture | Area | Population | Landarea |
|---|---|---|---|
| Tokyo | Kantou | 13834925 | 2191 |
| Kanagawa | Kantou | 9209442 | 2416 |
| Aichi | Chubu | 7575530 | 5172 |
| Kyoto | Kansai | 2545899 | 4612 |
| Osaka | Kansai | 8849635 | 1905 |
| Hyogo | Kansai | 5549568 | 8401 |
続いて、df1から関西以外のデータを抽出してみましょう。
df1 <- filter(df1, Area != "Kansai")| Prefecture | Area | Population | Landarea |
|---|---|---|---|
| Tokyo | Kantou | 13834925 | 2191 |
| Kanagawa | Kantou | 9209442 | 2416 |
| Aichi | Chubu | 7575530 | 5172 |
最後に東京のみの結果を抽出してみましょう。
df1 <- filter(df1, Prefecture == "Tokyo")| Prefecture | Area | Population | Landarea |
|---|---|---|---|
| Tokyo | Kantou | 13834925 | 2191 |
次はselect()を使用して、df1から県と人口に関するデータを抽出してみましょう。
df1 <- select(df1, Prefecture, Population)| Prefecture | Population |
|---|---|
| Tokyo | 13834925 |
rename()は列名を変更する際に使用します。dfの列名をローマ字表記にしてみましょう。“新しい列名”=古い列名の順にように指定します。
df1 <- rename(df,"Jinkou"=Population,"Kenmei"=Prefecture)| Kenmei | Area | Jinkou | Landarea |
|---|---|---|---|
| Hokkadio | Hokkaido | 5267762 | 83424 |
| Miyagi | Touhoku | 2292385 | 7282 |
| Tokyo | Kantou | 13834925 | 2191 |
| Kanagawa | Kantou | 9209442 | 2416 |
| Aichi | Chubu | 7575530 | 5172 |
| Kyoto | Kansai | 2545899 | 4612 |
| Osaka | Kansai | 8849635 | 1905 |
| Hyogo | Kansai | 5549568 | 8401 |
| Hiroshima | Chugoku | 2826858 | 8479 |
| Hukuoka | Kyusyu | 5129841 | 4986 |
おなじデータフレームを連続して操作する際、毎回データフレームを指定するのは少し面倒です。 パイプ%in%と呼ばれる機能を使うことで、先ほどまでの操作を非常に簡潔に表現することができます。 この場合、二行目以降ではデータフレームの指定をする必要がありません。
df1 <- filter(df,Area %in% c("Kantou","Kansai","Chubu")) %>%
filter(Area != "Kansai") %>%
filter(Prefecture == "Tokyo") %>%
select("Prefecture","Population") %>%
rename("Jinkou"="Population","Kenmei"="Prefecture")| Kenmei | Jinkou |
|---|---|
| Tokyo | 13834925 |
一行目でデータフレームを代入し、二行目以降でデータフレームの操作を行うという表現でも同様の結果が得られます。df2に神奈川県の人口に関するデータを抽出してみましょう。
df2 <- df %>%
filter(Area %in% c("Kantou","Kansai","Chubu")) %>%
filter(Area != "Kansai") %>%
filter(Prefecture == "Kanagawa") %>%
select("Prefecture","Population") %>%
rename("Jinkou"="Population","Kenmei"="Prefecture")| Kenmei | Jinkou |
|---|---|
| Kanagawa | 9209442 |
bind_rows()はデータフレームを縦に結合する場合に使用します。東京都の人口データであるdf1と神奈川県の人口データであるdf2を縦に結合してみましょう。
df3 <- bind_rows(df1,df2)| Kenmei | Jinkou |
|---|---|
| Tokyo | 13834925 |
| Kanagawa | 9209442 |
mutate()は列の追加、上書き、値や名前の変更等ができる非常に便利な関数です。まずはdfの地域に関する列を東日本と西日本の区分に上書きし、人口密度に関する列を追加してみましょう。
df4 <- df %>%
mutate(Area = recode(Area,Hokkaido="East",
Touhoku="East",
Kantou="East",
Chubu="West",
Kansai="West",
Chugoku="West",
Kyusyu="West")) %>%
mutate(Density = Population/Landarea)| Prefecture | Area | Population | Landarea | Density |
|---|---|---|---|---|
| Hokkadio | East | 5267762 | 83424 | 63.14444 |
| Miyagi | East | 2292385 | 7282 | 314.80157 |
| Tokyo | East | 13834925 | 2191 | 6314.43405 |
| Kanagawa | East | 9209442 | 2416 | 3811.85513 |
| Aichi | West | 7575530 | 5172 | 1464.71964 |
| Kyoto | West | 2545899 | 4612 | 552.01626 |
| Osaka | West | 8849635 | 1905 | 4645.47769 |
| Hyogo | West | 5549568 | 8401 | 660.58422 |
| Hiroshima | West | 2826858 | 8479 | 333.39521 |
| Hukuoka | West | 5129841 | 4986 | 1028.84898 |
mutate()と似た関数にtransmute()があります。transmute()は新規に作成した行のみを返すので、残したい列がある場合は指定する必要があります。
df4 <- df %>%
mutate(Area = recode(Area,Hokkaido="East",
Touhoku="East",
Kantou="East",
Chubu="West",
Kansai="West",
Chugoku="West",
Kyusyu="West")) %>%
transmute(Prefecture, Density = Population/Landarea)| Prefecture | Density |
|---|---|
| Hokkadio | 63.14444 |
| Miyagi | 314.80157 |
| Tokyo | 6314.43405 |
| Kanagawa | 3811.85513 |
| Aichi | 1464.71964 |
| Kyoto | 552.01626 |
| Osaka | 4645.47769 |
| Hyogo | 660.58422 |
| Hiroshima | 333.39521 |
| Hukuoka | 1028.84898 |
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.