欠損値の一括指定!

調査データで,ID,年齢,性別などに続いて,例えば4行目から10行目までが7項目からなる尺度評定値,というデータは一般的によくある形。
このなかで,評定値は1 〜5の値しかとらないんだけど,よく見たら9とか7とか,変な数字が入っていたとすると,これを欠損値にしたくなる*1

そういうとき,今までifelse関数を使っていました。例えば性別は1,2で入るはずだけど,という場合,

sampledata$sex <span class="synStatement">&lt;-</span> ifelse<span class="synSpecial">(</span>sampledata$sex&gt;<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>&gt;<span class="synConstant">5</span><span class="synSpecial">]</span> <span class="synStatement">&lt;-</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からもとの調査票にもどって入力し直すのが基本。戻れない,というちょっと特殊なケースで。