1

私は職場で心理測定機器を採点しており、いくつかの変数を再コード化したいと考えています。基本的に、各質問には 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==4an が返されます)。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番目のコンポーネントは次のとおりです。回答やコメントで説明されているように、値を逆にする推奨される方法は何ですか?

4

2 に答える 2

1

それはあなたの質問には答えませんが、あなたの問題を解決するはずです:

cols <- c(3,11,16)+3
project_f03[, cols] <- abs(project_f03[, cols]-4)
## or a lot of easier (as @TylerRinker suggested):
project_f03[, cols] <- max(project_f03[, cols]) - project_f03[, cols]
于 2012-10-01T19:33:30.250 に答える
1

率直な答えは、 を使用することにブラック ホールはないということです%in%NAただし、値を破棄したい場合は、次を使用しwhichます。project_f03[which(project_f03[,x]==4),x] <- 5

%in%以前のコードを短くすることができます:

for(x in 4:23) {project_f03[project_f03[,x]==-9 | project_f03[,x]==-1,x] <- NA}
#could be
for(x in 4:23) {project_f03[project_f03[,x] %in% c(-9,-1), x] <- NA}

@flodel が提案したように、for ループ内のコードのブロック全体を に置き換えることができますproject_f03[,x] <- rev(0:4)[match(project_f03[,x], 0:4, nomatch=10)]。保存する必要がありますNA。そして、おそらくコードを単純化する機会がもっとあるでしょう。

于 2012-10-02T18:15:57.523 に答える