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関数を使うと同じような操作が行える。