Rでデータフレームをcsvまたはtsvで保存する方法
1. readr パッケージを使う方法(Tidyverse標準)
「迷ったらこれ!」という標準的な方法です。
tidyverse パッケージ群に含まれているため、dplyr などと一緒に使うのに最適です。
- メリット: デフォルトでUTF-8出力(文字化けしにくい)、行番号(row names)を勝手に出力しない、高速。
- 関数: write_csv() (CSV用), write_tsv() (TSV用)
R
library(readr)
# CSVとして保存
write_csv(df, "data.csv")
# TSVとして保存
write_tsv(df, "data.tsv")
# パイプ演算子と組み合わせる場合もスムーズです
# df %>% filter(value > 100) %>% write_csv("filtered_data.csv")
2. data.table パッケージを使う方法(爆速)
「データ量が大きい(数GB〜)」場合に最強の方法です。
fwrite (fast write) という関数を使います。驚くほど高速です。
- メリット: 圧倒的に速い、メモリ効率が良い、自動で並列処理してくれる、gzip圧縮もファイル名を変えるだけで自動対応。
- 関数: fwrite()
R
library(data.table)
# CSVとして保存(デフォルト)
fwrite(df, "data.csv")
# TSVとして保存(区切り文字を自動判定しますが、明示も可能)
fwrite(df, "data.tsv", sep = "\t")
# おまけ:ファイル名を.gzにするだけで自動圧縮してくれます(容量節約に便利!)
fwrite(df, "data.csv.gz")
---
モダンな方法と昔の方法(write.csv)の違い
| 特徴 | write_csv (readr) | fwrite (data.table) | write.csv (Base R) |
|---|---|---|---|
| 速度 | 速い | 爆速 | 遅い |
| 行番号 (row.names) | デフォルトでなし | デフォルトでなし | デフォルトであり (これがズレの原因になりがち!) |
| 文字コード | UTF-8固定 | 自動 | OS依存 (CP932などになりがち) |
| 圧縮 | .gz 指定で可 | .gz 指定で可 | 別途処理が必要 |
---
まとめ
- 普段使い・解析パイプラインの途中: readr::write_csv() がクセがなくて使いやすいです。
- 巨大なデータ・速度重視: data.table::fwrite() 一択です。
どちらも row.names = FALSE をわざわざ書かなくていいので、コードもスッキリしますよ!
今回のようにCSV/TSVで保存するのも良いですが、もし「Rだけでまた読み込む」のであれば、読み書きがさらに高速で型情報(factorなど)も保持できる RDS形式 や Parquet形式 も便利です。
よろしければ、「RDSやParquet形式での保存方法」についても解説しましょうか?
Discussion