tidyr::gather

よく言われる「ヨコからタテへ」の関数

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

引数について

  • data: 使用するデータフレーム
  • key: まとめた時に、「この行の値はどの変数に入ってたものか」を示す変数。
  • value: まとめた変数の値。
  • …: まとめる変数を指定します。c()で束ねてもいいですしRでよく使われるテクニックは大抵使えます。

残りは?tidyr::gatherを参照してください。

tidyr::spread

よく言われる「ヨコからタテへ」の関数。まず下準備で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)

spreadの引数について

  • data: 対象となるデータフレーム
  • key: バラす時にキーとして使用する変数。この値が変数名になる
  • value: バタした時にできる変数に格納される値。

残りは?tidyr::spreadを参照してください。

tidyr::unite

複数列をまとめて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”で始まる変数は全部持ってこい」という意味です。

uniteの引数について

  • data: 対象となるデータフレーム。
  • col: ひっつけて統合した列の名前。
  • …: 統合する列を指定します。指定方法は上で説明してきたのと同様です。
  • sep: ひっつけた時のセパレータ。

残りは?tidyr:uniteを参照してください。

tidyr::separate

一つの列を複数の列にバラします。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と比較して引数を見れば、このコードは特に問題ないかと思います。

separateの引数について

  • data: 対象となるデータフレーム。
  • col: バラす対象の変数。
  • into: ばらした後に、それぞれの値をいれる変数名。文字ベクトルで与えます。
  • sep: バラす時のセパレータ。

この関数は、綺麗な状態であればこれで十分なのですが…一度?tidyr::separateのArgumentsをチェックすることをおすすめします。

その他の関数

省略します。

Enjoy!