【Rプログラミングの小技】NAを含むデータで行方向に数える(apply関数の応用)
Apply関数でNAを含むデータのデータ数を行方向に数えます
例えば、以下のようなデータセットがあったとします。
col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 |
---|---|---|---|---|---|---|---|
14 | 15 | 14 | 16 | 15 | 17 | 17 | NA |
17 | 16 | 17 | 16 | 15 | 18 | 19 | 15 |
18 | 19 | 20 | 19 | 17 | 17 | NA | NA |
20 | 21 | 19 | 20 | 19 | 22 | 20 | NA |
19 | 20 | 19 | 17 | 17 | 17 | 18 | NA |
1列目はNAがひとつ、2列目はNAなし、...のようにNAを含むデータセットがあるとします。
このとき、このデータセットをRで作ると
dat <- matrix(c(14,15,14,16,15,17,17,NA, 17,16,17,16,15,18,19,15, 18,19,20,19,17,17,NA,NA, 20,21,19,20,19,22,20,NA, 19,20,19,17,17,17,18,NA) ,nrow=5,byrow=T)
となります。行方向のデータの数を知りたければ、通常はAPPLY関数とlengthを使って以下のようにします。
> apply(dat,1,length) [1] 8 8 8 8 8
これは、NAも数えてしまっているので、NAを数えないように真偽値に変換して、TRUE(=1)を合計(SUM)することで、カウントします。
> apply(!is.na(dat),1,sum) [1] 7 8 6 7 7
上記で使っているように、関数がlengthではなければ、NAを無視するというオプションna.rm = TRUEというのがあります。
> apply(dat,1,var,na.rm = TRUE) [1] 1.619048 1.982143 1.466667 1.142857 1.476190