調査データで,ID,年齢,性別などに続いて,例えば4行目から10行目までが7項目からなる尺度評定値,というデータは一般的によくある形。
このなかで,評定値は1 〜5の値しかとらないんだけど,よく見たら9とか7とか,変な数字が入っていたとすると,これを欠損値にしたくなる*1。
そういうとき,今までifelse関数を使っていました。例えば性別は1,2で入るはずだけど,という場合,
sampledata$sex <span class="synStatement"><-</span> ifelse<span class="synSpecial">(</span>sampledata$sex><span class="synConstant">2</span><span class="synSpecial">,</span><span class="synConstant">NA</span><span class="synSpecial">,</span>sampledata$sex<span class="synSpecial">)</span>
とする。でも,4から10行目,と複数行にわたるとき,ひとつひとつ書いていくのは面倒だ・・・
という時の解決策を見つけました。
sampledata<span class="synSpecial">[</span><span class="synConstant">4</span><span class="synSpecial">:</span><span class="synConstant">10</span><span class="synSpecial">][</span>sampledata<span class="synSpecial">[</span><span class="synConstant">4</span><span class="synSpecial">:</span><span class="synConstant">10</span><span class="synSpecial">]</span>><span class="synConstant">5</span><span class="synSpecial">]</span> <span class="synStatement"><-</span> <span class="synConstant">NA</span>
データフレームの要素指定条件を中括弧で書く,というのは知っていたけど,こういう使い方が出来るとはね!備忘録の意味も込めて書いておきます。
参考記事はこちら。scratch-R: missing data
追記)
一行あたりの欠損値の数が知りたい,って時。例えば,25項目の調査で20項目以上欠損している(ほとんど回答してない)やつは捨てるぜ,というときに欠損値の数を数え上げる必要があるかと。そんなときにはこんな風に書きましょう。
apply<span class="synSpecial">(</span>dataframe<span class="synSpecial">,</span><span class="synConstant">1</span><span class="synSpecial">,</span><span class="synType">function</span><span class="synSpecial">(</span>x<span class="synSpecial">)</span>sum<span class="synSpecial">(</span>is.na<span class="synSpecial">(</span>x<span class="synSpecial">)))</span>
これで各ケースの欠損値の数がでますよ。
*1:もちろん元データに戻れる時は,IDからもとの調査票にもどって入力し直すのが基本。戻れない,というちょっと特殊なケースで。