56  data.frame関数

それでは、スライドでお伝えしたことを実際にRで動かして見ていきましょう。

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

まずは文字列型のベクトルを作成しましょう。

alcohol = c("週1日以内","週4-6日","週4-6日","毎日","のまない","週1-3日","毎日")

str(alcohol)
 chr [1:7] "週1日以内" "週4-6日" "週4-6日" "毎日" "のまない" "週1-3日" ...

このベクトルに含まれているものは文字列ですね? 文字列を利用して表を作成した場合に、実はdata.frameとtibbleでは結果が違ってきます。

やってみましょう、

dat_df <- data.frame(alcohol=alcohol)
dat_ti <- tibble(alcohol=alcohol)

str(dat_df)
'data.frame':   7 obs. of  1 variable:
 $ alcohol: chr  "週1日以内" "週4-6日" "週4-6日" "毎日" ...
str(dat_ti)
tibble [7 × 1] (S3: tbl_df/tbl/data.frame)
 $ alcohol: chr [1:7] "週1日以内" "週4-6日" "週4-6日" "毎日" ...

str関数で、作成したそれぞれの表の型をみてみると、data.frameの方はalcohol列がFactorと表示されている一方、tibbleの方はchrと表示されています。

実は、data.frameで作成した表は、文字列が勝手に因子に置き換わってしまっています

すこしヘルプファイルを見てみましょう

?data.frame
starting httpd help server ... done

(*注:以下のdefault.stringAsFactors()は新しいRのVersionでは廃止されているため、うまく動きません) Usageの中の、stringsAsFactorsという設定がdefault.stringsAsFactors()となっており

#default.stringsAsFactors()

TRUEになっています。

strings(文字列)As(を)Factors(因子に)というオプションがTRUEになっているため、data.frame関数は勝手に文字列を因子型に変換してしまいます。

この挙動、知らないと困るのは、例えば、間違って数値型に列を変換してしまったときに、

str(alcohol)
 chr [1:7] "週1日以内" "週4-6日" "週4-6日" "毎日" "のまない" "週1-3日" ...
as.numeric(alcohol)
Warning: NAs introduced by coercion
[1] NA NA NA NA NA NA NA

文字列型であれば数値型に変換できずエラーがでてしまうのですが、先のスライドでも解説したように、因子型は実態が数字とその対応表という形で保たれているイメージなので、

as.numeric(dat_df$alcohol)
Warning: NAs introduced by coercion
[1] NA NA NA NA NA NA NA

数字型に変換できてしまいます!

この挙動、便利な反面、こまることが多いので、data.frame型を利用する場合は、

dat_df2 <- data.frame(
  alcohol=alcohol, 
  stringsAsFactors = FALSE
)

str(dat_df2)
'data.frame':   7 obs. of  1 variable:
 $ alcohol: chr  "週1日以内" "週4-6日" "週4-6日" "毎日" ...

このように、stringAsFactorsのアーギュメントをFALSEとして作成する癖づけておくとよいと思います。

tibble形式はこのようにかってに型を置き換えて表を作成したりはしないので、この設定を気にする必要はありません。このレクチャー以降は、原則tibbleで表を作成していきます。

それでは、次の動画では因子型を作成する方法について解説していきます。