gather()関数とspread()関数で列をワイドフォーマットに変換する
Rで列をワイドフォーマットの別々の列に変換する方法
Rで列をワイドフォーマットの別々の列に変換するには、いくつかの方法があります。 ここでは、tidyverse
パッケージとtidyr
パッケージを使った方法を紹介します。
必要なパッケージ
tidyverse
: データの操作と可視化のための総合的なパッケージtidyr
: データの構造変換のための機能を提供
方法
pivot_wider()関数を使う
pivot_wider()
関数は、列をワイドフォーマットに変換する最も簡単な方法の一つです。
library(tidyverse)
# データフレーム
df <- data.frame(id = c(1, 2, 3),
value1 = c("a", "b", "c"),
value2 = c(1, 2, 3))
# 列をワイドフォーマットに変換
df_wide <- df %>%
pivot_wider(names_from = c("value1", "value2"),
values_from = id)
# 結果
df_wide
#> # A tibble: 3 x 3
#> value1 value2 id
#> <chr> <dbl> <dbl>
#> 1 a 1 1
#> 2 b 2 2
#> 3 c 3 3
gather()関数とspread()関数を使う
gather()
関数とspread()
関数は、より複雑なデータ構造変換を行う際に便利です。
# 列を1つの列にまとめる
df_long <- df %>%
gather(key = "variable", value = "value", -id)
# 列をワイドフォーマットに変換
df_wide <- df_long %>%
spread(key = variable, value = value)
# 結果
df_wide
#> # A tibble: 3 x 3
#> value1 value2 id
#> <chr> <dbl> <dbl>
#> 1 a 1 1
#> 2 b 2 2
#> 3 c 3 3
unnest()関数を使う
unnest()
関数は、リスト型データフレームをワイドフォーマットに変換する際に便利です。
# リスト型データフレームを作成
df_list <- df %>%
mutate(value = list(value1, value2))
# 列をワイドフォーマットに変換
df_wide <- df_list %>%
unnest(value)
# 結果
df_wide
#> # A tibble: 3 x 3
#> id value1 value2
#> <dbl> <chr> <dbl>
#> 1 1 a 1
#> 2 2 b 2
#> 3 3 c 3
library(tidyverse)
# データフレーム
df <- data.frame(id = c(1, 2, 3),
value1 = c("a", "b", "c"),
value2 = c(1, 2, 3))
# 列をワイドフォーマットに変換
df_wide <- df %>%
pivot_wider(names_from = c("value1", "value2"),
values_from = id)
# 結果
df_wide
#> # A tibble: 3 x 3
#> value1 value2 id
#> <chr> <dbl> <dbl>
#> 1 a 1 1
#> 2 b 2 2
#> 3 c 3 3
# 列を1つの列にまとめる
df_long <- df %>%
gather(key = "variable", value = "value", -id)
# 列をワイドフォーマットに変換
df_wide <- df_long %>%
spread(key = variable, value = value)
# 結果
df_wide
#> # A tibble: 3 x 3
#> value1 value2 id
#> <chr> <dbl> <dbl>
#> 1 a 1 1
#> 2 b 2 2
#> 3 c 3 3
# リスト型データフレームを作成
df_list <- df %>%
mutate(value = list(value1, value2))
# 列をワイドフォーマットに変換
df_wide <- df_list %>%
unnest(value)
# 結果
df_wide
#> # A tibble: 3 x 3
#> id value1 value2
#> <dbl> <chr> <dbl>
#> 1 1 a 1
#> 2 2 b 2
#> 3 3 c 3
library(reshape2)
# 列をワイドフォーマットに変換
df_wide <- melt(df, id.vars = "id")
# 結果
df_wide
#> # A tibble: 6 x 3
#> variable value id
#> <chr> <chr> <dbl>
#> 1 value1 a 1
#> 2 value2 1 1
#> 3 value1 b 2
#> 4 value2 2 2
#> 5 value1 c 3
#> 6 value2 3 3
手作業で変換
データフレームが小さければ、手作業で列をワイドフォーマットに変換することも可能です。
# 新しい列を作成
df$value3 <- df$value1 + df$value2
# 列を削除
df <- df %>%
select(-value1, -value2)
# 結果
df
#> # A tibble: 3 x 3
#> id value3
#> <dbl> <dbl>
#> 1 1 2
#> 2 2 3
#> 3 3 4
r tidyverse tidyr