csvファイルはreadr::read_csv()
を使えば適切な型を考えて読み込んでくれますが,Stataの.dtaをhaven::read_dta()
で読み込んだ場合などは,データ型が適切なものになっていない場合があります。
library(tidyverse) library(haven) # データの読み込み df <- read_dta("./AEJApp2008-0202_data/data_for_analysis.dta") df <- df %>% select(GPA_year1, age_at_entry, firstyear, english, french, other_lang) df %>% head()
GPA_year1 <dbl> | age_at_entry <dbl> | firstyear <dbl> | english <dbl> | french <dbl> | other_lang <dbl> |
---|---|---|---|---|---|
3.82 | 19 | 2002 | 1 | 0 | 0 |
3.64 | 19 | 2001 | 1 | 0 | 0 |
1.95 | 18 | 2000 | 1 | 0 | 0 |
3.44 | 19 | 2003 | 1 | 0 | 0 |
2.18 | 18 | 1996 | 1 | 0 | 0 |
3.49 | 19 | 2003 | 1 | 0 | 0 |
上の例の場合,整数型(integer)にすべきデータも倍精度浮動小数点型(double)になっています。
(データはLindo, Sanders and Oreopoulos (2010)のものを使用)
そういった,データ型がおかしいデータフレームが手元にあるときに,データフレーム内のすべての列に対して,各列にふさわしいデータ型へと変換するには,
以下のコードのように,dplyr::mutate_all()
関数(DFのすべての列に関数を適用して列を追加あるいは上書きする関数)の中にreadr::parse_guess()
関数(与えられたベクトルを適切なデータ型に変換する関数)を入れた以下のようなコードを使うのが良さそうです。
df2 <- df %>% mutate_all(parse_guess) df2 %>% head()
GPA_year1 <dbl> | age_at_entry <int> | firstyear <int> | english <int> | french <int> | other_lang <int> |
---|---|---|---|---|---|
3.82 | 19 | 2002 | 1 | 0 | 0 |
3.64 | 19 | 2001 | 1 | 0 | 0 |
1.95 | 18 | 2000 | 1 | 0 | 0 |
3.44 | 19 | 2003 | 1 | 0 | 0 |
2.18 | 18 | 1996 | 1 | 0 | 0 |
3.49 | 19 | 2003 | 1 | 0 | 0 |
(なお,CP932(SHIFT-JIS)の日本語文字列がある場合はmutate_all(parse_guess, locale = locale(encoding = "cp932"))
とlocaleを指定します。)