library(curl)
## Using libcurl 8.1.2 with LibreSSL/3.3.6
<- "https://figshare.com/ndownloader/files/22237545"
url <- tempfile("cover.tsv")
tsv_file curl(url) |>
readLines() |>
writeLines(file(tsv_file))
そろそろRユーザーもApache ArrowでParquetを使ってみませんか?から4年。私もParquetを使ってみました。
データ
例として今回は、石狩川源流域の風倒後の森林更新データとして公開しているデータセットから植生被度データを利用します。
Itô, Hiroki (2018). Data on forest regeneration after catastrophic windthrow in the headwater region of the Ishikari River, Hokkaido, Japan. figshare. Dataset. doi:10.6084/m9.figshare.6442796.v3
まずデータをダウンロードします。
arrowパッケージでデータの読み書き
arrowパッケージを読み込みます。
library(arrow)
##
## 次のパッケージを付け加えます: 'arrow'
## 以下のオブジェクトは 'package:utils' からマスクされています:
##
## timestamp
read_delim_arrow
関数でタブ区切りデータを読み込み、最初の部分を表示します。
<- read_delim_arrow(tsv_file,
cover_data delim = "\t")
head(cover_data)
## Belt Quadrat Layer Year Date Scientific_name
## 1 27 1 canopy 1980 1980-09 Betula platyphylla var. japonica
## 2 27 1 canopy 1984 1984-09 Betula platyphylla var. japonica
## 3 27 1 canopy 1988 1988-09-13 Betula platyphylla var. japonica
## 4 27 1 canopy 1988 1988-09-13 Betula ermanii
## 5 27 1 canopy 1998 1998-07-23 Betula platyphylla var. japonica
## 6 27 1 canopy 1998 1998-07-23 Betula ermanii
## Japanese_name Cover
## 1 シラカンバ 5
## 2 シラカンバ 5
## 3 シラカンバ 5
## 4 ダケカンバ 1
## 5 シラカンバ 5
## 6 ダケカンバ 2
書き出し
Parquetではfactor型を扱えるということなので、Layer, Scientific_name, Japanese_name, Coverの4列をfactor型に変換してから、write_parquet
関数を使用して、Parquetでデータを出力します。その後、念のため、書き出したオブジェクトを削除しておきます。
<- tempfile("cover_data.parquet")
parquet_file
|>
cover_data ::mutate_at(c("Layer", "Scientific_name",
dplyr"Japanese_name", "Cover"), as.factor) |>
write_parquet(parquet_file)
# remove object
rm("cover_data")
読み込み
今度は読み込みます。テキストファイルからの読み込みとはちがって、factor型がそのままfactor型となっています。
<- read_parquet(parquet_file)
cover_data head(cover_data)
## # A tibble: 6 × 8
## Belt Quadrat Layer Year Date Scientific_name Japanese_name Cover
## <int> <int> <fct> <int> <chr> <fct> <fct> <fct>
## 1 27 1 canopy 1980 1980-09 Betula platyphylla … シラカンバ 5
## 2 27 1 canopy 1984 1984-09 Betula platyphylla … シラカンバ 5
## 3 27 1 canopy 1988 1988-09-13 Betula platyphylla … シラカンバ 5
## 4 27 1 canopy 1988 1988-09-13 Betula ermanii ダケカンバ 1
## 5 27 1 canopy 1998 1998-07-23 Betula platyphylla … シラカンバ 5
## 6 27 1 canopy 1998 1998-07-23 Betula ermanii ダケカンバ 2
read_parquet
では、列を指定した読み込みができるということで、一部の列のみを読み込んでみます。列の指定にはtidy-selectが使用できます。
<- read_parquet(parquet_file,
cover_sub col_select = "Belt" | ends_with("name") | "Cover")
head(cover_sub)
## # A tibble: 6 × 4
## Belt Scientific_name Japanese_name Cover
## <int> <fct> <fct> <fct>
## 1 27 Betula platyphylla var. japonica シラカンバ 5
## 2 27 Betula platyphylla var. japonica シラカンバ 5
## 3 27 Betula platyphylla var. japonica シラカンバ 5
## 4 27 Betula ermanii ダケカンバ 1
## 5 27 Betula platyphylla var. japonica シラカンバ 5
## 6 27 Betula ermanii ダケカンバ 2
ということで、巨大なデータを読み込むときに威力を発揮しそうです。