r tidyverse 使い方 | 列分割 separate関数 – tidyrパッケージ

tidyverseで1つの列(文字列型)を分割して別の列に分けるには、tidyrパッケージのseparate関数を使います。separate関数は、「指定した列」を「指定した区切り文字」で分割します。Rの標準的な操作strsplit関数を使うと同じような操作が行えます。

列を分割する

書式

separate関数は、第1引数にデータ、第2引数以降に列の分割条件を指定します。「対象となる列名」「分割後の新しい列名(分割数の数分指定する)」「区切り文字」を指定します。尚、パイプ(%>%)を使って連続的に処理を記述する場合は、第1引数のデータは省略することができます。

単純な分割

separate関数に1つの分割条件(文字)を指定して、列を分割しています。指定した分割条件は、「sep = “,”」で、name列が「,」でcolumn1とcolumn2に分割されます。

 1: > library(tidyverse)
 2: 
 3: > my_data <- data.frame(id = c(1,2,3), name=c("A:a,1-10", "B:b,2-10", "C:c,3-10"))
 4: > my_data
 5:   id     name
 6: 1  1 A:a,1-10
 7: 2  2 B:b,2-10
 8: 3  3 C:c,3-10
 9: 
10: > my_data %>% separate(name, c("column1", "column2"), sep=",")
11:   id column1 column2
12: 1  1     A:a    1-10
13: 2  2     B:b    2-10
14: 3  3     C:c    3-10

複数の区切り文字を指定した分割

いずれかの区切り文字で分割

separate関数に複数の分割条件(1文字の集まり)を指定して、列を分割しています。指定した分割条件は、「”[:,]”」で、角括弧([])内のそれぞれの文字が区切り文字になります。今回は、コロン(:)とカンマ(,)で列が分割されました。

1: > my_data %>% separate(name, c("column1", "column2", "column3"), sep="[:,]")
2:   id column1 column2 column3
3: 1  1       A       a    1-10
4: 2  2       B       b    2-10
5: 3  3       C       c    3-10

文字列で分割

separate関数に文字列で分割条件(2文字以上)を指定して、列を分割しています。指定した分割条件は、「”[abc],”」で、「a,」「b,」「c,」が区切り文字(文字列)の条件です。これら組み合わせでできた文字列で、列が分割されました。

1: > my_data %>% separate(name, c("column1", "column2"), sep="[abc],")
2:   id column1 column2
3: 1  1      A:    1-10
4: 2  2      B:    2-10
5: 3  3      C:    3-10

Rの標準的な操作

データフレームの分割したい列を指定し、strsplit関数で分割します(複数の区切り文字を指定可能)。分割後のリスト情報をdo.callで適当な構造に整形し、元のデータフレームと結合しました(行数は同じなので)。結合したデータから、元の列を削除したり、分割で生成された新しい列に名前をつけるなどすると、列の分割操作が行えます。

 1: > my_data <- data.frame(id = c(1,2,3), name=c("A:a,1-10", "B:b,2-10", "C:c,3-10"))
 2: > my_data
 3:   id     name
 4: 1  1 A:a,1-10
 5: 2  2 B:b,2-10
 6: 3  3 C:c,3-10
 7: 
 8: > data.frame(my_data, do.call("rbind", strsplit(as.character(my_data$name), "[-:]")))
 9:   id     name X1  X2 X3
10: 1  1 A:a,1-10  A a,1 10
11: 2  2 B:b,2-10  B b,2 10
12: 3  3 C:c,3-10  C c,3 10

まとめ

  • tidyverseで1つのchracter列を分割して別の列に分けるには、tidyrパッケージのseparate関数を使う。
  • separate関数は、「指定した列」を「指定した区切り文字」で分割できる。分割数に合わせて、分割した際の新しい列名を指定する。
  • Rの標準的な操作strsplit関数を使うと同じような操作が行える。