x <- "123"
class(x) # character[1] "character"
y <- as.numeric(x)
class(y) # numeric[1] "numeric"
y + 1 # 計算できる[1] 124
分類: 幹(全員必須)
依存関係: U0 → U1 → U2 → U4 → U5 → U6 → U7 → U8 → U9 → U10
学習目標:
as.numeric()、as.character()、as.factor()等で変数の型を変換できるfactor()で水準の順序やラベルを制御できるifelse()やdplyr::case_when()で変数を再コーディングできるcut()で連続変数をカテゴリ変数に変換できるscale()で標準化(z得点化)ができるmodel.matrix()でダミー変数を作成できるdplyr::across()で複数変数に同じ変換を一括適用できるRでは変数の型によって、使える関数や分析手法が変わります。たとえば:
mean() は数値型(numeric)にしか使えないtable() はfactor型や文字型で意味があるggplot2 の fill や color はfactor型で色分けされるデータを読み込んだとき、変数の型が想定通りでないことはよくあります。数値のはずが文字型になっている、カテゴリのはずが数値型になっている、といった状況です。分析に入る前に型を正しく整える必要があります。
| 型 | 説明 | 例 | 確認関数 |
|---|---|---|---|
numeric / double |
実数(小数を含む) | 3.14 |
is.numeric() |
integer |
整数 | 1L, 2L |
is.integer() |
character |
文字列 | "Tokyo" |
is.character() |
factor |
カテゴリ(水準をもつ) | factor("A") |
is.factor() |
logical |
論理値 | TRUE, FALSE |
is.logical() |
as.型名() 関数で型を変換します:
[1] "character"
[1] "numeric"
[1] 124
数値に変換できない文字列は NA になります:
心理学データでは、性別・条件・群といったカテゴリ変数をfactor型にしておくことが重要です。factor型にすると:
変数を平均0、標準偏差1に変換する操作を標準化(standardization)と呼びます。単位の異なる変数を比較可能にするために使います。
\[z_i = \frac{x_i - \bar{x}}{s_x}\]
カテゴリ変数を回帰分析で使うとき、0/1のダミー変数に変換します。\(k\) 水準のカテゴリ変数は \(k-1\) 個のダミー変数で表現します(1つは参照カテゴリ)。
たとえば「セリーグ」「パリーグ」の2水準なら、ダミー変数は1つ(パリーグ=1, セリーグ=0)です。
文字型の "42" を数値型に変換する関数は?
as.型名() が型変換関数の基本形です。as.numeric("42") は数値の 42 を返します。逆に as.character(42) は文字列の "42" を返します。
factor() 関数の levels 引数は何を指定しますか?
levels で水準の順序を指定できます。指定しないとアルファベット順(日本語ならUnicodeの順序)になります。
グラフの軸やtableの表示順、回帰分析の参照カテゴリに影響します。
factor() 関数の labels 引数は何をしますか?
labels は水準の表示名を変えます。levels の順序に対応します。
データ上は 1, 2 でも、表示や分析では "男性", "女性" として扱われます。
ifelse(条件, 真の値, 偽の値) の結果として正しいのはどれですか?
ifelse(5 > 3, "大きい", "小さい") の結果は?
ifelse() は条件が TRUE のとき第2引数を、FALSE のとき第3引数を返します。ベクトルに対しても要素ごとに適用されるので、mutate() の中で変数の再コーディングに使えます。
scale() 関数は何をしますか?
scale(x) は各値から平均を引き、標準偏差で割ります(z得点化)。scale(x, center = TRUE, scale = FALSE) とすると中心化(平均を引くだけ)のみ行います。
3水準のカテゴリ変数(A, B, C)をダミー変数にすると、ダミー変数はいくつ必要ですか?
\(k\) 水準のカテゴリ変数は \(k-1\) 個のダミー変数で表現します。3水準なら2つです。1つの水準を参照カテゴリ(baseline)として、残りの水準を0/1で表します。
たとえばAを参照カテゴリにすると:
| 元の値 | ダミー1(B) | ダミー2(C) |
|---|---|---|
| A | 0 | 0 |
| B | 1 | 0 |
| C | 0 | 1 |
cut() 関数は何をしますか?
cut() は連続変数を指定した境界値で区切り、カテゴリ変数(factor型)に変換します。
dplyr::case_when() は ifelse() と比べてどのような利点がありますか?
ifelse() を入れ子にすると読みにくくなりますが、case_when() は複数条件を並列に書けます。
TRUE ~ "D" は「上のどの条件にも当てはまらない場合」を意味します。
iris データセットの Species 変数の型を確認してください。次に、水準の順序を "virginica", "versicolor", "setosa" に変更してください。
forcats::fct_relevel() を使う方法もあります:forcats::fct_relevel(Species, "virginica", "versicolor", "setosa")
BaseballDecade.csv の Year 変数は "2020年度" のような文字列です。「年度」を除去して数値型に変換してください。
stringr::str_remove() で「年度」を除去し、as.numeric() で変換します。
readr::parse_number() を使う方法もあります:dplyr::mutate(Year = readr::parse_number(Year))
BaseballDecade.csv のセ・リーグとパ・リーグを区別する League 変数(factor型)を作成してください。セリーグは Giants, Carp, Tigers, Swallows, Dragons, DeNA です。
ifelse() または case_when() と %in% を組み合わせます。
pacman::p_load(tidyverse)
df <- readr::read_csv("../data/BaseballDecade.csv")
ce_teams <- c("Giants", "Carp", "Tigers", "Swallows", "Dragons", "DeNA")
df2 <- df %>%
dplyr::mutate(League = dplyr::if_else(
team %in% ce_teams, "セリーグ", "パリーグ")) %>%
dplyr::mutate(League = factor(League))
table(df2$League)iris の Sepal.Length を平均値で「高群」「低群」に分ける変数 SL_group をfactor型で作成してください。
BaseballDecade.csv の salary(年俸)を scale() で標準化してください。標準化後の平均と標準偏差が0と1になることを確認してください。
scale() は行列を返すので、as.numeric() でベクトルに変換しています。dplyr::mutate() の中で使う場合はこの変換が必要です。
iris の Species をダミー変数に変換してください。model.matrix() を使います。
結果は3列になります:(Intercept)(切片、常に1)、Speciesversicolor、Speciesvirginica の2つのダミー変数です。setosa が参照カテゴリ(baseline)になっています。
切片を除くには model.matrix(~ Species - 1, data = iris) とします(この場合3つのダミー変数が作られます)。
BaseballDecade.csv の salary(年俸)を cut() で「1000万未満」「1000万〜5000万」「5000万〜1億」「1億以上」の4段階に分類してください。
right = FALSE は区間を [a, b) (左閉右開)にします。Inf で上限なしを表現しています。
iris の数値変数(1〜4列目)を dplyr::across() で一括して標準化してください。
across() は複数の列に同じ関数を一括適用します。where(is.numeric) で数値型の列だけを対象にすることもできます。
BaseballDecade.csv の position 変数を、「投手」と「野手」(投手以外)の2水準のfactor型変数 position2 に変換してください。dplyr::case_when() を使ってください。
case_when() の TRUE ~ "野手" は「上のどの条件にも当てはまらない場合」のデフォルト値です。
課題: BaseballDecade.csv を読み込み、以下の前処理パイプラインを一本で書いてください。AIに相談しながら効率的なコードを組み立てましょう。
Year を数値型に変換team をfactor型に変換League 変数を作成(factor型)salary を標準化した salary_z を作成salary を4段階にカテゴリ化した salary_cat を作成position を「投手」「野手」に再コードした position2 を作成(factor型)提出物: AIとの対話ログ、完成したコード。
課題: 「尺度水準(名義・順序・間隔・比率)」とRの変数型の対応関係について、AIに質問しながら整理してください。
ordered = TRUE のfactor型にすべきかordered factorにすると統計モデルの振る舞いがどう変わるか提出物: AIとの対話ログ、対応表と考察。
このユニットでは、分析前のデータ整備に不可欠な型変換と再コーディングを学びました:
as.numeric(), as.character(), as.factor(), as.logical()factor(levels = ..., labels = ...), forcats::fct_relevel()ifelse(), dplyr::if_else(), dplyr::case_when()cut(breaks = ..., labels = ...)scale()(z得点化)model.matrix()dplyr::across()で複数変数に同じ処理型の整備は「分析前の地味な作業」ですが、ここを怠ると分析結果が間違ったものになります。データを読み込んだら、str() で型を確認し、必要に応じて変換する習慣をつけてください。
次のユニット: U10. ggplot2では、整形したデータを可視化する方法を学びます。
進捗: あなたは今 9-C-8 まで完了しました!(と仮定)次は 9-B-1 に進みましょう。