盆暗の学習記録

データサイエンスを中心として,日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

[R]データ型の一括変換

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()
ABCDEFGHIJ0123456789
GPA_year1
<dbl>
age_at_entry
<dbl>
firstyear
<dbl>
english
<dbl>
french
<dbl>
other_lang
<dbl>
3.82192002100
3.64192001100
1.95182000100
3.44192003100
2.18181996100
3.49192003100

上の例の場合,整数型(integer)にすべきデータも倍精度浮動小数点型(double)になっています。
(データはLindo, Sanders and Oreopoulos (2010)のものを使用)

そういった,データ型がおかしいデータフレームが手元にあるときに,データフレーム内のすべての列に対して,各列にふさわしいデータ型へと変換するには,

以下のコードのように,dplyr::mutate_all()関数(DFのすべての列に関数を適用して列を追加あるいは上書きする関数)の中にreadr::parse_guess()関数(与えられたベクトルを適切なデータ型に変換する関数)を入れた以下のようなコードを使うのが良さそうです。

df2 <- df %>% mutate_all(parse_guess) 
df2 %>% head()
ABCDEFGHIJ0123456789
GPA_year1
<dbl>
age_at_entry
<int>
firstyear
<int>
english
<int>
french
<int>
other_lang
<int>
3.82192002100
3.64192001100
1.95182000100
3.44192003100
2.18181996100
3.49192003100

(なお,CP932(SHIFT-JIS)の日本語文字列がある場合はmutate_all(parse_guess, locale = locale(encoding = "cp932"))とlocaleを指定します。)