R言語おぼえがき（逆引き）

# この記事について

データ分析の学校に通っている中で、R言語でよく使う（けどよく忘れる）処理をメモっておきます。

自分自身の逆引き辞典として使えるように。

# R言語おぼえがき

## インストール関連

### バージョンを指定しないでインストール

```R
install.packages("Library_Name")
```

### バージョンを指定してインストール

```R
remotes::install_version("Library_Name", version = "x.x.x")
```

### パッケージの存在チェックをした上でインストール

```R
if(!require(Library_Name)){install.packages("Library_Name")}
```

## ベクトル

### 特定の範囲のベクトルを作る

```R
2:5 #2から5までの整数が入ったベクトル
```

## パターン・組み合わせ

### 1〜5が入った箱が２つあり、１つずつ出したときのパターン

```R
expand.grid(1:5,1:5)
```

### 1〜5の中から2つの数字を取り出したときの組み合わせ

```R
t(combn(1:5,3))
```

## データフレーム関連

### データフレームを作る - data.frame()

```R
df <- data.frame(列名1=vector1, 列名2=vector2)
```

### データフレーム - 表示

#### 列名の一覧を表示する

```R
colnames(df)
```

#### 項目の一覧と代表的な値を表示する

```R
glimpse(df)
```

#### データフレームのサイズ（行数と列数）を確認する

```R
dim(df)
```

結果は行数、列数の順に表示される。
`10 20` と表示されたら、そのデータは10行20列。

#### カテゴリカルな値の一覧を表示する

```R
levels(df$column_name)
```

#### 文字列型の項目の一覧とカウントを表示する

```R
table(df$column_name)
```

### データフレーム - 列の操作

#### 特定の列を取り出す

```R
# iris から 1 列目を取り出す
iris[, 1]

# iris から Sepal.Length を取り出す（どっちのやりかたでもOK）
iris[, "Sepal.Length"]
iris$Sepal.Length

#複数列を名前で取り出したいなら
iris[, c("Sepal.Length", "Petal.Length")]
```

:::note warn
1列だけ取り出した場合、該当の列の値がすべて入った ベクトル を返す
-> データフレームじゃなくなるよ！

-> データフレームのままにしたい場合は、drop=Fを指定する必要あり
iris[,1,drop=F]

複数列を取り出した場合は、データフレームのまま。
:::

#### 特定の列を除外する

```R
# 1列消す
df$消したい列 <- NULL

# 複数列ある場合
iris[, !(names(iris) %in% c("Species","Sepal.Length"))]
```

#### 列の追加

```R

# 初期化するなら
df$存在しない列名（追加したい列名） <- NA

# 入れたい値が既にあり、それが df と同じ長さのベクトルに入っている場合
df$存在しない列名（追加したい列名） <- dfの行数と同じ長さのベクトル

```

:::note alert
存在する列名にNULLを代入すると列がまるごと消えるので注意
:::

#### 列名の一括変更（正規表現）

```R
# x というデータフレームの列名のスペースをアンスコに変更
colnames(x) <- gsub(" ", "_", colnames(x))

# x というデータフレームの列名のドットを除外
colnames(x) <- gsub("\\.", "", colnames(x))
```

:::note warn
第一引数は正規表現なので、.などはエスケープする必要あり
:::

#### merge = ふたつのデータフレームの JOIN

SQLなら確実にJOINで処理するであろうあの操作を、Rでは merge という関数を使って処理します。

```R

merged <- merge(df1, df2, by.x="df1のキーとなる列名", by.y="df2のキーとなる列名"

```


### データフレーム - 行の操作

#### 特定の行を取り出す（インデックス指定）

```R
# iris の 1行目を取り出す
iris[1,]
```

:::note 
値が1行分入った データフレーム を返す
:::

#### 特定の行を除外する（インデックス指定）

```R
# iris の 1行目を除外する
iris[-1,]
```

#### 行を条件でフィルタリング

```R
#df の中に point という列があり、その列の値が80以上のデータをフィルタリングしたい場合
df[df$point > 80,]

#複数条件での抽出
df[df$point < 20 & df$attended == TRUE,]

#Genre列が特定の値の行だけを抽出
df_g <- df[df$Genre %in% c("action","adventure","animation","comedy","drama"), ]
```

#### 欠損を含む行を抽出

```R
df[!complete.cases(df), ]
```

#### 欠損を含まない行を抽出

```R
df[complete.cases(df), ]
```

#### 正規表現で抽出

```R

# 前提：stats というデータフレームの Country.Name 列に国名が入っている

# Ja で始まる行を抽出　-> Jamaica と Japan が出てくる
stats[grep("^Ja",stats$Country.Name),]

# guay で終わる行を抽出 -> Paraguay と Uruguay が出てくる
stats[grep("guay$",stats$Country.Name),]
```

#### 複数行を名前指定で抽出

```R

# 前提：stats というデータフレームの Country.Name 列に国名が入っている

stats[stats$Country.Name %in% c("Uruguay", "Paraguay"),]

```

#### ソートする

```R
# decreasing=TRUE で降順に
iris[order(iris$Sepal.Length,Sepal.Width,decreasing=TRUE),]
```

#### 行方向に結合 - rbidn

```R
# decreasing=TRUE で降順に
wine <- rbind(wine_red, wine_white)
```
### データフレーム - 集計

```R
# %>% を使うために必要なライブラリ
library(dplyr)

# CountyNameごとのLifeExpの平均を集計し、新たに df_avr に入れる
df_avr <- df %>%
  group_by(CountryName) %>%
  summarize(AvgLifeExp = mean(LifeExp))
```

### データフレーム - 型の操作

#### ファクター化

##### 全項目をfactorに
```R
df <- df %>%
  mutate_all(as.factor)
```

##### 特定の項目をfactorに

```R
df <- df %>%
  mutate(
    year = as.factor(year),
    month = as.factor(month)
  )
```

##### データフレームの文字列型を factor　型に一括変換

```R
df <- df %>% 
  mutate(across(where(is.character), as.factor))
```

df は、別名の df に代入しても、同じ df を上書きしてもOK

# 現在は以上です

新しいことを学んだら、またこちらに書き足していきます。