library(tibble)
library(microbenchmark)tibble
パッケージの概要
tibbleは、従来のdata.frameを洗練させたデータ構造tibbleを作成することのできるパッケージです。また、このパッケージは、Rでモダンな分析環境を構築するためのパッケージ群である「tidyberse」に含まれています。
tibbleの作成方法
as_tibble関数を利用することで、listや、data.frameをtibbleに変換することができます。
class(iris)[1] "data.frame"
as_tibble(iris)# A tibble: 150 × 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
# ℹ 140 more rows
また、tibble関数を用いると、個々のベクトルをまとめて、tibbleを作成することができます。
tibble(x = 1:3, y = 1)# A tibble: 3 × 2
x y
<int> <dbl>
1 1 1
2 2 1
3 3 1
data.frameとの違い①:表示
あるデータをConsoleに表示する場合、tibbleはデフォルトでデータの表示数を制限し、Consoleがデータで埋め尽くされるのを防いでくれます。また、データの型がカラム名の下に表示されます。
例えば、irisには150個のデータが含まれており、data.frameのまま表示すると、150個のデータが表示されます。一方、tibbleとして表示すると、Consoleに表示されるデータの数は10個だけです。 (表示される数は、オプションで変更することが可能です)
as_tibble(iris)# A tibble: 150 × 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
# ℹ 140 more rows
#head関数を利用すれば、data.frameでも表示数をコントロール可能
head(iris, n=10) Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
data.frameとの違い②:列名の変換有無
ベクトルからdata.frameを作成する場合、自動で列名が変換されてしまうケースがあるが、tibbleを作成する場合、デフォルトの設定では列名が自動変換されません。 また、name_repairsをuniversalと指定すると、列名が変換されるようになります。
tibble(`a + b` = 1:5)# A tibble: 5 × 1
`a + b`
<int>
1 1
2 2
3 3
4 4
5 5
data.frame(`a + b` = 1:5) a...b
1 1
2 2
3 3
4 4
5 5
tibble(`a 1` = 1, `a 2` = 2, .name_repair = "universal")New names:
• `a 1` -> `a.1`
• `a 2` -> `a.2`
# A tibble: 1 × 2
a.1 a.2
<dbl> <dbl>
1 1 2
data.frameとの違い③:サブセット操作の厳密さ
特定の列を指定して、データを表示する場合、tibbleでは厳密に列名を指定する必要があります。 また、data.frameはサブセットを指定する条件次第で、データフレームではなく、ベクトルを返すこともありますが、tibbleは常にtibbleを返します。
df <- data.frame(one = 1, two = "a", three = "v")
df2 <- tibble(df)
df$o[1] 1
df2$oWarning: Unknown or uninitialised column: `o`.
NULL
df[, c("one", "two")] one two
1 1 a
df2[, c("one", "two")]# A tibble: 1 × 2
one two
<dbl> <chr>
1 1 a
df[, "one"][1] 1
df2[, "one"]# A tibble: 1 × 1
one
<dbl>
1 1
data.frameとの違い④:パフォーマンス
as.tibble()は、as.data.frame()よりも高速です
X <- list(1:10000, 1:10000, 1:10000)
names(X) <- c("test1", "test2", "test3")
microbenchmark(
as_tibble(X),
as.data.frame(X)
)Unit: microseconds
expr min lq mean median uq max neval cld
as_tibble(X) 93.801 98.8500 113.1159 105.851 114.051 481.701 100 a
as.data.frame(X) 180.901 188.9515 200.6730 196.750 202.601 375.301 100 b