Stata学習奮闘記(2日目)
前回の記事はコチラ sickle-sword.hatenablog.com
変数の選択・削除
- 変数x1とx2を削除
drop x1 x2
- 変数x1とx2だけを残す(それ以外は削除)
keep x1 x2
簡単ですね。
Rで同じことをやるならdplyr::selectでしょう
library(dplyr) # x1とx2を削除 select(df, -x1, -x2) # x1とx2だけ残す select(df, x1, x2)
ちなみにdplyrのselectでは,x1からx9までを残す・消すのような動作をよくやります。
select(df, x1:x9) select(df, -x1:-x9)
みたいなやつです。
これは,
keep x1-x9 drop x1-x9
のような感じで実現できます。
この-(ハイフン)で変数をつなぐ記法は,recodeなどでも使えるようです(後述)。
変数の作成
シンプルに変数をリコードする場合
- 変数のコピー
新しい変数を作るときに,元の変数をそのままリコードすると,ミスのチェックが難しくなる。 そのため一度変数をコピーしてからリコードを行うのが吉。
* 変数x1から変数x2を作成 gen x2=x1
- 変数の変換
* 1は1,2と3が2,4が3,9が欠損になるように変換 recode x2 (1=1)(2=2)(3=2)(4=3)(9=.)
(以前の値=新しい値)という書き方。Stataでは欠損値は.(ピリオド)で指定する。
ちょっと複雑な場合
recodeでは変数の値を一対一対応で指定したが,より複雑なケース,例えば一対一で指定するには面倒な量的変数や,外部変数の値を参照してリコードを行うケースには対応できない。
そこで以下ではgen,replaceとifを組み合わせてリコードを行う。
- x1の値が10以上なら1,それ以外なら0のダミー変数x2を作成
gen x2=1 if x1>=10 replace x2=0 if x1<10
- x1が1かつx2が1なら1,それ以外なら0のダミー変数x3を作成
gen x3=1 if x1==1 & x2==1 replace x3=0 if x1!=1 | x2!=1
Stataってelseないんですか…?けっこう面倒くさい
- Rだとif_elseがあります
mutate(data, x2 = if_else(x1 >= 10, 1, 0) )
- あとcase_whenが個人的には一番よく使う
とても柔軟で好き
mutate(data, x2 = case_when(x1 >= 10 ~ 1, is.na(x1) ~ NA_real_, TRUE ~ 0) )
ただし,柔軟すぎて欠損値まで書き換えてしまうので明示する必要がある。(if_elseはNAはそのままNAになる)
- ちなみにStataのrecodeを模したdplyr::recodeもある
# 1は1,2と3が2,4が3,9が欠損になるように変換 mutate(data, x2 = recode(x1, `1` = 1, `2` = 2, `3` = 2, `4` = 3, `9` = NA_real_))