0Pricing
R Academy · レッスン

文字列列のためのseparate()とunite()

複数の情報を含む列の値を分割・結合します。

「文字列列のためのseparate()とunite()」はCoddyKit上の無料R Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

文字列列の分割と結合

生データでは、1つの列に複数の情報が詰め込まれていることがよくあります(例: '2024-03-15' には年、月、日が含まれています)。tidyr の separate() 関数と unite() 関数を使うと、1つの列を複数に分割したり、複数の列を1つに結合したりできます。

library(tidyr)

# Date stored as a single string column
df <- data.frame(
  id = 1:4,
  date = c('2024-01-15','2024-03-22','2023-11-08','2024-06-30'),
  value = c(100, 200, 150, 175)
)

print(df)

separate() — 1列を複数列に分割

separate(df, col, into, sep) は、区切り文字を使って文字列列を複数の新しい列に分割します。into 引数には新しい列名を指定し、sep には区切り文字を指定します(デフォルトは英数字以外の任意の文字です)。

library(tidyr)

df <- data.frame(
  id = 1:4,
  date = c('2024-01-15','2024-03-22','2023-11-08','2024-06-30')
)

# Split 'date' into year, month, day
separate(
  df,
  col = date,
  into = c('year','month','day'),
  sep = '-'
)

convert 引数を指定した separate()

デフォルトでは、separate() は文字列列を作成します。convert = TRUE を設定すると、新しい列が最も適切な型(整数、数値、論理値)に自動変換されます。年や月の列に特に便利です。

library(tidyr)

df <- data.frame(
  event = c('2024-1','2024-2','2023-12'),
  score = c(85, 90, 78)
)

result <- separate(
  df,
  col = event,
  into = c('year','month'),
  sep = '-',
  convert = TRUE
)

print(result)
cat('year type:', class(result$year), '\n')
cat('month type:', class(result$month))

remove = FALSE を指定した separate()

デフォルトでは、separate() は元の列を削除します。remove = FALSE を設定すると、分割後の新しい列とともに元の列も保持できます。分割結果を確認したい場合や、元の列を参照用に残したい場合に便利です。

library(tidyr)

df <- data.frame(
  full_code = c('US-CA-001','US-TX-002','UK-LDN-003')
)

separate(
  df,
  col = full_code,
  into = c('country','state','code'),
  sep = '-',
  remove = FALSE   # Keep original column
)

固定位置での separate()

区切り文字の代わりに、sep に整数ベクトルを渡して、固定した文字位置で分割することもできます。正の整数は左から数え、負の整数は右から数えます。

library(tidyr)

# Product code: first 3 chars = category, next 4 = id
df <- data.frame(
  code = c('ABC1234','XYZ5678','DEF9012'),
  qty = c(10, 20, 15)
)

separate(
  df,
  col = code,
  into = c('category','product_id'),
  sep = 3    # Split after position 3
)

unite() — 列を1列に結合

unite(df, col, ..., sep) は、複数の列を1つの文字列列に結合します。df の後に置く最初の引数が新しい列名で、その後に結合する列、最後に区切り文字列を指定します。

library(tidyr)

df <- data.frame(
  first = c('Alice','Bob','Carol'),
  last = c('Smith','Jones','White'),
  score = c(85, 90, 78)
)

unite(
  df,
  col = 'full_name',
  first, last,
  sep = ' '
)

remove = FALSE を指定した unite()

separate() と同様に、unite() はデフォルトで元の列を削除します。remove = FALSE を設定すると、新しく結合した列とともに元の列も保持できます。両方の形式が必要な場合に便利です。

library(tidyr)

df <- data.frame(
  year = c(2024, 2024, 2023),
  month = c(1, 3, 12),
  day = c(15, 22, 8)
)

unite(
  df,
  col = 'date_str',
  year, month, day,
  sep = '-',
  remove = FALSE
)

unite() によるキーの作成

unite() の一般的な用途の1つは、複数の識別子列を結合して複合キーを作成することです。複数のフィールドから共通キーを作成してテーブルを結合する場合に便利です。

library(tidyr)
library(dplyr)

orders <- data.frame(
  year = c(2024, 2024, 2023),
  region = c('East','West','East'),
  seq_num = c(1, 1, 2)
)

orders_keyed <- orders %>%
  unite(col = 'order_key', year, region, seq_num, sep = '_')

print(orders_keyed)

separate_rows() — 複数行への分割

separate_rows(df, col, sep) は、複数の値を含むセルを別々の行に分割します。列に分割する separate() とは異なります。セルにカンマ区切りの項目リストが含まれている場合などに便利です。

library(tidyr)

# Tags stored as comma-separated values in one cell
df <- data.frame(
  id = 1:3,
  title = c('Intro to R','Data Viz','ML Basics'),
  tags = c('r,beginner','r,ggplot,visualization','r,ml,modeling')
)

separate_rows(df, tags, sep = ',')

separate() と unite() の連結

パイプラインで separate() と unite() を連結すると、日付文字列の形式を変更したり、一貫性のない形式を修正したり、既存の列から新しい複合識別子を作成したりできます。

library(tidyr)
library(dplyr)

# Reformat date from YYYY-MM-DD to DD/MM/YYYY
df <- data.frame(
  id = 1:3,
  date = c('2024-01-15','2024-03-22','2023-11-08')
)

df %>%
  separate(date, into=c('year','month','day'), sep='-') %>%
  unite(col='date_eu', day, month, year, sep='/')

余分な要素や不足している要素の処理

separate() には、into の列数より要素が多い場合に使う extra 引数があります。指定できる値は 'warn'(デフォルト)、'drop'(余分な要素を破棄)、'merge'(最後の要素を分割せずに保持)です。同様に、要素が少ない場合は fill で処理し、'warn'、'right'、'left' を指定できます。

library(tidyr)

# Inconsistent data: some rows have 2 parts, some have 3
df <- data.frame(
  code = c('A-1','B-2-extra','C-3'),
  value = c(10, 20, 30)
)

# 'merge' keeps the last piece unsplit
separate(df, code, into=c('prefix','suffix'), sep='-',
         extra='merge')

確認問題

列に 'tag1,tag2,tag3' のようなカンマ区切りの値が含まれている場合、タグごとに1行へ分割するにはどの関数を使いますか?

まとめ: separate() と unite()

separate() と unite() における重要なポイント:

  • separate(col, into, sep) — 区切り文字または位置を使って、1列を複数列に分割します
  • convert = TRUE — 分割結果の型を自動的に変換します
  • remove = FALSE — 両方の関数で元の列を保持します
  • unite(col, ..., sep) — 複数の列を1つの文字列列に結合します
  • separate_rows(col, sep) — 区切り文字で分けられた値を複数行に分割します(列ではありません)
  • extra と fill 引数は、一貫性のない分割結果を処理します
library(tidyr)
library(dplyr)

df <- data.frame(
  id = 1:3,
  datetime = c('2024-01-15 09:30','2024-03-22 14:15','2023-11-08 11:45')
)

df %>%
  separate(datetime, into=c('date','time'), sep=' ') %>%
  separate(date, into=c('year','month','day'), sep='-', convert=TRUE) %>%
  separate(time, into=c('hour','minute'), sep=':', convert=TRUE)

よくある質問

「文字列列のためのseparate()とunite()」レッスンは無料ですか?

はい。「文字列列のためのseparate()とunite()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「文字列列のためのseparate()とunite()」で何を学びますか?

複数の情報を含む列の値を分割・結合します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「文字列列のためのseparate()とunite()」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. pivot_longer()によるワイド形式からロング形式への変換
  2. pivot_wider()によるロング形式からワイド形式への変換
  3. 文字列列のためのseparate()とunite()
  4. データフレームのネストとアンネスト
← R Academyに戻る