私は職場で心理測定機器を採点しており、いくつかの変数を再コード化したいと考えています。基本的に、各質問には 5 つの可能な回答があり、それぞれ 0 から 4 の価値があります。それがデータベースにコード化された方法であるため、それらを合計する以外に何もする必要はありません。ただし、スコアが逆転した質問が 3 つあります (したがって、誰かが 0 と回答した場合、スコアは 4 になります)。したがって、私はそれらを「逆」にしています。
データフレームは基本的に次のようになります。
studyid timepoint date inst_q01 inst_q02 ... inst_q20
1 2 1995-03-13 0 2 ... 4
2 2 1995-06-15 1 3 ... 4
これが私がこれまでに行ったことです。
# Survey Processing
# Find missing values (-9) and confusions (-1), and sum them
project_f03$inst_nmiss <- rowSums(project_f03[,4:23]==-9)
project_f03$inst_nconfuse <- rowSums(project_f03[,4:23]==-1)
project_f03$inst_nmisstot <- project_f03$inst_nmiss + project_f03$inst_nconfuse
# Recode any missing values into NAs
for(x in 4:23) {project_f03[project_f03[,x]==-9 | project_f03[,x]==-1,x] <- NA}
rm(x)
さて、これまでのところすべて問題ありません。3 つの逆のものを再コーディングしようとしています。さて、私の最初の考えは、3 つの変数を介して単純なループを実行し、以下のような一連の割り当てステートメントを実行することでした。
# Questions 3, 11, and 16 are reversed
for(x in c(3,11,16)+3) {
project_f03[project_f03[,x]==4,x] <- 5
project_f03[project_f03[,x]==3,x] <- 6
project_f03[project_f03[,x]==2,x] <- 7
project_f03[project_f03[,x]==1,x] <- 8
project_f03[project_f03[,x]==0,x] <- 9
project_f03[,x] <- project_f03[,x]-5
}
rm(x)
したがって、5 つの割り当てステートメントは新しい値を再割り当てするだけで、ループは問題の 3 つの変数すべてを処理します。スケールを反転していたので、すべてを 5 オフセットし、すべての再コード化が完了したら 5 を引くのが最も簡単だと思いました。ただし、主な問題は、NA があり、それらの NA がループでエラーになることです (当然、R ではNA==4
an が返されます)。NA
ふーん、基本的なルールを忘れてた!
3つの選択肢を思いつきましたが、どれが最適かはわかりません。
- まず、ループの後に NA を作成するコードを移動するだけで、問題なく動作するはずです。長所: 実装が最も簡単です。短所: 生来の (作成されたものではなく) NA を持たないデータを受信している場合にのみ機能します。
- 次に、ロジック ステートメントを次のように変更できます。
project_f03[!is.na(project_f03[,x]) && project_f03[,x]==4,x]
これにより、ロジックの競合が解消されます。長所:それほど難しくありません。うまくいくことはわかっています。短所: 余分なコードが多く、面倒くさそうです。 - 最後に、ロジックを から
project_f03[project_f03[,x]==4,x] <- 5
に 変更できましたproject_f03[project_f03[,x] %in% 4,x] <- 5
。これはうまくいくようですが、それが良い習慣であるかどうかはわかりません。長所: この問題をすばやく修正し、機能しているようです。「何とか何とかLOGIC何とか<-何とか」の一般的な構文の流れを保持します。短所: ブラック ホールを作成する可能性がありますか? このように使用することの潜在的な影響が何であるかはわかり%in%
ません。
明確にするために編集
この質問には 1 つの主要な要素があります。%in%
論理演算を行うときに、上記の 3 番目のポイントで説明したように使用しても安全ですか、それともそうしない理由がありますか?
2番目のコンポーネントは次のとおりです。回答やコメントで説明されているように、値を逆にする推奨される方法は何ですか?