いつものパスタブログ

研究とか,Rとか

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_))