No.22571 R 複数のNA判定に基づく代入  【明石】 2018/06/16(Sat) 19:06

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
毎々,ご丁寧なご教示をいただき,誠にありがとうございます。
改めて,御礼を申し上げます。

青木先生にご教示いただきたいことが出てきました。
何卒どうぞよろしくお願いいたします。

添付ファイルでお示しをします。 ご覧ください。

表1から表2を作成したいと思います。

表1のデータフレームは,以下のようになっています。
・socreは,すべてNA
・score1とscore2の組み合わせは,以下の3ケースのいずれか
  ・score1がNA,score2は数値
  ・score1が数値,score2はNA
  ・score1,score2両方ともにNA

score1,score2で,数値がセットされている側の値をscoreにセットする。

データフレームを dat として,Rコードを書きました。
jun <- which(! is.na(dat$score1))
dat$score[jun] <- dat$score1[jun]

jun <- which(! is.na(dat$score2))
dat$score[jun] <- dat$score2[jun]
score1,score2を,各々,NAの判定をして,scoreに代入しています。

これらを1つにまとめる書き方があれば,ご教示をお願いいたします。

お手数をおかけいたします。


No.22572 Re: R 複数のNA判定に基づく代入  【青木繁伸】 2018/06/16(Sat) 21:35

いろいろやり方はあるでしょうが,もっとも真っ正直に書くならば
> dat = data.frame(
+ score=NA,
+ score1=c(NA, NA, 2.174, 6.042, NA, 2.656, NA, NA, NA, NA, 3.153, 4.344),
+ score2=c(1.481, 4.113, NA, NA, 2.674, NA, 2.500, 2.276, 4.162, NA, NA, NA))

> dat$score = ifelse(is.na(dat$score1) & !is.na(dat$score2), dat$score2, ifelse(!is.na(dat$score1) & is.na(dat$score2), dat$score1, NA))
> dat
score score1 score2
1 1.481 NA 1.481
2 4.113 NA 4.113
3 2.174 2.174 NA
4 6.042 6.042 NA
5 2.674 NA 2.674
6 2.656 2.656 NA
7 2.500 NA 2.500
8 2.276 NA 2.276
9 4.162 NA 4.162
10 NA NA NA
11 3.153 3.153 NA
12 4.344 4.344 NA
トリッキーな書き方ならば,出現する可能性のある数値よりも小さい値を dummy にわりあてて,以下のようにすることも可能
> dummy = -99999 # 出現する可能性のある数値が正ならばこのような値を仮定する
> dat[is.na(dat)] = dummy
> dat$score = ifelse(dat$score1 > dat$score2, dat$score1, dat$score2)
> dat[dat == dummy] = NA
> dat
score score1 score2
1 1.481 NA 1.481
2 4.113 NA 4.113
3 2.174 2.174 NA
4 6.042 6.042 NA
5 2.674 NA 2.674
6 2.656 2.656 NA
7 2.500 NA 2.500
8 2.276 NA 2.276
9 4.162 NA 4.162
10 NA NA NA
11 3.153 3.153 NA
12 4.344 4.344 NA
どちらが効率がよいか?

No.22573 Re: R 複数のNA判定に基づく代入  【明石】 2018/06/16(Sat) 21:54

青木先生 様;

お忙しいところを失礼いたします,明石と申します。

今回も,ご丁寧なご教示をいただき,大変に良い勉強をさせていただきました。

2つの方法とも理解できましたが,ifelse()関数を使わせていただきます。

今回も助けていただき,誠にありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る