今回は、前回の内容の続きで、複数の変数の内容を1つの変数にまとめる方法を紹介します。
複数の変数に別れた条件名を1つにまとめたい
以下のデータフレームでは、ある条件に該当するかどうかが複数の項目への解答として記録されています。
参加者 | 条件A | 条件B | 条件C |
1 | 1 | 0 | 0 |
2 | 0 | 0 | 1 |
3 | 0 | 1 | 0 |
4 | NA | NA | NA |
5 | NA | 0 | 1 |
このデータをよく見ると、各参加者は条件A,B,Cのいずれか1つにしか該当しないようです。このような場合、どの条件に該当するかを1つの変数で表現することができます。たとえば、条件Aは0、条件Bは1、条件Cは2というようにです。
参加者 | 条件A | 条件B | 条件C | |
1 | 1 | 0 | 0 | 0 |
2 | 0 | 0 | 1 | 2 |
3 | 0 | 1 | 0 | 1 |
4 | NA | NA | NA | NA |
5 | NA | 0 | 1 | NA |
これと同じことをR言語を利用して行うのならifelse関数が便利です。まず条件名を示すための列を作成し、それに-1を代入します。これであとから、1度も代入されていないセルがあるかどうかを確認できます。
dat <- data.frame(id = c(1,2,3,4,5), VarA = c(1,0,0,NA,NA), VarB = c(0,0,1,NA,0), VarC = c(0,1,0,NA,1)) print(dat) dat$Var <- rep(-1,nrow(dat)) print(dat)
ではifelse関数を利用して、どの条件に該当するかを調べてみましょう。
#条件Aに該当するときは0 dat$VarA2 <- ifelse(dat$VarA == 1,0,-1) #条件Bに該当するときは1 dat$VarB2 <- ifelse(dat$VarB == 1, 1,-1) #条件Cに該当するときは2 dat$VarC2 <- ifelse(dat$VarC == 1, 2, -1) for (i in 1:nrow(dat)){ dat[i,"Var"] <- max(c(dat[i,"Var"],dat[i,"VarA2"],dat[i,"VarB2"],dat[i,"VarC2"])) } print(dat)
少しややこしいのですが、こうすると1つでもNAが含まれている参加者についてNAを戻すことができます。そうではなく、NAがあったとしても全てでなければ埋まっている項目の中から選びたいという場合にはna.rm = TRUEをmax関数の引数として加えてください。