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関数を使うと同じような操作が行える。
論文・データ解析の支援


関連記事









![バイオインフォ 道場 [bioinfo-Dojo]](https://bioinfo-dojo.net/wp-content/uploads/2016/03/some_object_luca-bravo-alS7ewQ41M8-unsplash.jpg)
