よく言われる「ヨコからタテへ」の関数
library(dplyr)
library(tidyr)
library(knitr)
df <- tidyr::gather(data=iris, key = keykey, value = valuevalue, -Species)
knitr::kable(head(df, 5))
Species | keykey | valuevalue |
---|---|---|
setosa | Sepal.Length | 5.1 |
setosa | Sepal.Length | 4.9 |
setosa | Sepal.Length | 4.7 |
setosa | Sepal.Length | 4.6 |
setosa | Sepal.Length | 5.0 |
残りは?tidyr::gather
を参照してください。
よく言われる「ヨコからタテへ」の関数。まず下準備でiris
を縦型データに変換します。
library(dplyr)
library(tidyr)
library(knitr)
# irisにID列を追加して、gatherでまとめている
df <- dplyr::mutate(iris, id=rownames(iris)) %>%
tidyr::gather(key = keykey, value = valuevalue, contains("l."))
knitr::kable(head(df,5))
Species | id | keykey | valuevalue |
---|---|---|---|
setosa | 1 | Sepal.Length | 5.1 |
setosa | 2 | Sepal.Length | 4.9 |
setosa | 3 | Sepal.Length | 4.7 |
setosa | 4 | Sepal.Length | 4.6 |
setosa | 5 | Sepal.Length | 5.0 |
# ひっつけたけどspreadでバラします
df_2 <- tidyr::spread(df, key = keykey, value = valuevalue)
knitr::kable(head(df_2))
Species | id | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width |
---|---|---|---|---|---|
setosa | 1 | 5.1 | 3.5 | 1.4 | 0.2 |
setosa | 10 | 4.9 | 3.1 | 1.5 | 0.1 |
setosa | 11 | 5.4 | 3.7 | 1.5 | 0.2 |
setosa | 12 | 4.8 | 3.4 | 1.6 | 0.2 |
setosa | 13 | 4.8 | 3.0 | 1.4 | 0.1 |
setosa | 14 | 4.3 | 3.0 | 1.1 | 0.1 |
dplyr::mutate
は変数を追加(変換)する関数です。gather内にあるcontains("l.")
は束ねる変数を指定しています。意味は「“l.”を含む変数を全て指定」という意味です。これについてはこちらの資料を参照してください。dplyr::select
の話ですがtidyr::gather
でも全く同じように使えます。
tidyr::sprad
は、tidyr::gather
の逆パターンとなります。keyで指定した変数の値を、ヨコに広げます。その広げた変数の中に入ってくる値は、valueで指定した変数の値となります。
ただしtidyr::spread
には注意が必要です。この関数を使うときにはIDとなるような変数が必要です。理由はちょっと説明できませんが、必要だということは覚えておいてください。したがって、下のコードはエラーになります(評価させていません):
library(dplyr)
library(tidyr)
library(knitr)
# gatherで触れた内容と同一
df <- tidyr::gather(data=iris, key = keykey, value = valuevalue, -Species)
# この時点でヨコにした時に主キーになるような変数はなし
# これをこのまま実行するとエラーを出す
df_NG <- tidyr::spread(data = df, key = keykey, value = valuevalue)
残りは?tidyr::spread
を参照してください。
複数列をまとめて1つの列にします。縦長になるのではなく、ひっつけます。
df <- tidyr::unite(data = iris, col = colll, starts_with("Sepal"), sep = "-")
knitr::kable(head(df))
colll | Petal.Length | Petal.Width | Species |
---|---|---|---|
5.1-3.5 | 1.4 | 0.2 | setosa |
4.9-3 | 1.4 | 0.2 | setosa |
4.7-3.2 | 1.3 | 0.2 | setosa |
4.6-3.1 | 1.5 | 0.2 | setosa |
5-3.6 | 1.4 | 0.2 | setosa |
5.4-3.9 | 1.7 | 0.4 | setosa |
引数内のstarts_with("Sepal")
は、「“Sepal”で始まる変数は全部持ってこい」という意味です。
残りは?tidyr:unite
を参照してください。
一つの列を複数の列にバラします。uniteの逆パターンです。
# 一旦ひっつけます(uniteのコードと同一)
df <- tidyr::unite(data = iris, col = colll, starts_with("Sepal"), sep = "-")
# separateを実行
df2 <- tidyr::separate(data = df, col = colll, into = c("Sepal.Length","Sepal.Width"), sep = "-")
knitr::kable(head(df2))
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
4.6 | 3.1 | 1.5 | 0.2 | setosa |
5 | 3.6 | 1.4 | 0.2 | setosa |
5.4 | 3.9 | 1.7 | 0.4 | setosa |
tidyr::unite
と比較して引数を見れば、このコードは特に問題ないかと思います。
この関数は、綺麗な状態であればこれで十分なのですが…一度?tidyr::separate
のArgumentsをチェックすることをおすすめします。
省略します。
Enjoy!