0

列から情報を差し引く必要があるデータセットに取り組んでいます。これは、1 人が最大 6 回、最小 2 回までテストされる反復測定データセットです。データは長い形式です

サンプルのデータセットは次のとおりです。

ID=c('X1', 'X1', 'X1', 'X1', 'X2', 'X2', 'X2', 'X3', 'X3', 'X3', 'X3')
Time=c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4)
Score=c(10, 9, 8, 6, 10, 8, 4, 9, 8, 6, 4)
dat=data.frame(ID, Time, Score)

最も単純な形式では、私のデータには次の変数が含まれています。

  • Participant ID- 一意の英数字コード
  • Time- 1 ~ 6 の範囲
  • Score- テスト 1 のスコアは 1 ~ 10 です。スコアは同じままであるか、テストを繰り返しても低下する可能性があります。

テスト セッションでの連続したスコアの差を計算し、それらを合計して、各参加者が持っているスコアの数で割りたいと思います。より単純な形式では、次のようになります。

Sum of [(time1-time2 score) + (time2-time3 score) + (time3-time4 score)]/N (Scores for participant)  

分母は、参加者ごとに異なる数の繰り返し測定を考慮する必要があります。

以前、私のコードはこれでした:

S = length(unique(dat$ID))     
dat$ppt = as.numeric(factor(dat$ID, labels = 1:S))     
mat = matrix(nrow = S, ncol = 2) # empty matrix 

for (s in 1:S) { # for each subject 
  scores = dat[dat$ID == s, 'Score'] # get scores for participant s 
  scores = na.omit(scores) 
  avCumDiff = sum(diff(scores))/length(scores) # average cumulative difference 
  mat[s,] = c(s, avCumDiff) # add to matrix
}     
colnames(mat) <- c('ppt', 'AvDiff') 

このコードの問題は、スコアを相互に累積的に減算することです。スコア1と2、2と3、3と4などの違いを追加したい.

これをどのように行うのが最善ですか?

4

1 に答える 1

2

これは、dplyr (または data.table) のワンライナーです。dplyr のバージョンは次のとおりです (akrun はすでに data.table のバージョンを提供しています)。

require(dplyr)
dat %>% group_by(ID) %>% summarize(avdiff = (last(Score)-first(Score)) / n() )

  ID  avdiff
1 X1 -1.00
2 X2 -2.00
3 X3 -1.25

またはabsdiffが必要な場合は、avdiff = abs(last(Score)-first(Score) / n()

コードのほとんどは冗長であり、削除できました。

  • length(unique(dat$ID)それらを繰り返し処理するのを見るたびに、通常は集約のために、分割-適用-結合を1:S行っているという強いコード臭がします。group_by(ID)
  • 次に、スライスscores = dat[dat$ID == s, 'Score']はまさにその group_by 操作でした。(ちなみに、常に空になります、つまり[dat$ppt == s, 'Score'])
  • ID を要素に変換するdat$ppt = as.numeric(factor(dat$ID...必要はまったくありませんでした。group_by(ID)それをします。グループ名または行列の行が整数でなくても問題ありません。
  • mat = matrix(...)手動で挿入する場合と同様に、空の結果を宣言する必要はありません。mat[s,] = c(s, avCumDiff)
  • scores = na.omit(scores)不要です。ほとんどの sum、cumsum、absdiff などの関数は、デフォルトで NA を除外します。R 関数の「ハウス スタイル」は、NA を認識し、NA の存在下でスマートなことを行うことです。
  • したがって、スコアの absdiff を集計し、試行回数で割ります。
  • first(Var), last(Var), n()グループ内での dplyr の使用に注意してください
  • 最後に、dplyr::summarize集計列に直接名前を付けることができるので、colnames(mat) <- c('ppt', 'AvDiff'). 操作を実行するsummarizeと、得られる結果は、グループ化に使用される列 (ID) と集計列 ( avdiff) のみを含む df です。他の変数Time, Scoreは自動的に削除されます。

split-apply-combine、aggregation、dplyr、または data.table のチュートリアルについて読んで、試してみてください。

于 2015-07-09T20:02:20.407 に答える