1

私はこのようなデータを持っています(これは説明のためのテストデータです):

test <- matrix(c(1, 1, 1, 2, 2, 2 , 529, 528, 528, 495, 525, 510,557, 535, 313,502,474, 487 ), nr=6, dimnames=list(c(1,2,3,4,5,6),c("subject", "rt1", "rt2")))

そして、私はそれをこれに変える必要があります:

test2<-matrix(c(1,1,1,2,2,2,529,528,528,495,525,510,"slow","slow","fast","fast","slow","slow",557, 535, 313,502,474, 487,"fast","fast","slow","slow","fast","fast"), nr=6, dimnames=list(c(1,2,3,4,5,6),c("subject", "rt1","speed1", "rt2","speed2")))

speed1列は次のように計算されます。被験者の中央値rt1を計算します。個々の値が中央値よりも小さい場合、スコアは速くなります。rt1の個々のセル値が中央値よりも大きい場合、スコアは遅くなります。セル値が中央値にある場合、セルは分析から削除され(削除またはNA)、その対象の中央値が再計算されます。このプロセスはspeed2列に対して繰り返されますが、rt2を使用します。

おそらく、ある種のifステートメントですか?

明確にするために:各サブジェクトの中央値(合計で40あります)と、中央値(そのサブジェクトの場合)にある値を除外し、中央値を再計算(そのサブジェクトの場合)にします。

4

3 に答える 3

4

対象の中央値を実際に実行するように編集

実際に使用している可能性が高いのはデータフレームである場合、例ではマトリックスが大きくなる傾向があります。それでは、最初にそれを邪魔にならないようにしましょう。マトリックスでは、単一のタイプのデータを使用する必要があります。数字をテキストにしたいという印象はありません。他の変数を数値にすることはできません。したがって、test2はおそらく次のように開始する必要があります...

test2 <- data.frame(test)

そしておそらく

test2$subject <- factor(test2$subject)

実行していることが正しいことを確認するためだけに、実際には中央値/主題である列を追加することをお勧めします。ここからは、RT1で作業するだけで、RT2用に複製できます。

test2$rt1med <- ave(test2$rt1, test2$subject, FUN = median)

これにより、各サブジェクトの中央値が格納されている列が生成されます。必要に応じて、列ではなくスタンドアロンのベクトルにすることもできます。これで、正解です。正確には、ifステートメント、ifelse()ステートメントと同じくらい簡単です。

test2$speed1 <- ifelse(test2$rt1 > test2$rt1med, 'slow', 'fast')

フレームに中央値を残しました。あなたは彼らがいなくなって欲しいと言った。OK、中央値なしでフレームをそれ自体に設定するだけです...

test2 <- test2[test2$rt1 != test2$rt1med,]

しかし、実際には、おそらくNAを使用して、実際の中央値を示すことによって、実際の中央値を追跡するのがおそらく最善です...

test2$rt1[test2$rt1 == test2$rt1med] <- NA
于 2010-10-15T03:27:40.023 に答える
2

中央値の「再計算」を考慮した別の解決策:

test2 <- data.frame(test)

makespeed <- function(x){
    id <- x != median(x)
    ifelse(x[id]-median(x[id]) <0,"slow","fast")
}

tapply(test2$rt1,as.factor(test2$subject),makespeed)

ちょっと考えてみてください。3つのオプションがあります:

  1. ケースの数は偶数であり、中央値は2つの中間のケースの平均として定義されます。これら2つが互いに等しくない場合、中央値に等しい値はありません。

  2. ケースの数が奇数であるため、中央値はデータの1つの値に等しくなります。それを削除すると、ケースの数が偶数になり、ケース1に戻ります。

  3. 中央値に等しい一連の値があります。最終的には偶数のケースになりますが、真ん中の2つのケースは異なります。1つは以前に計算された中央値よりも低く、もう1つは高くなっています。これで、ケース1に戻ります。

したがって、実際、中央値との違いに本当に興味がある場合は、私のコードを使用できます。速いか遅いかだけを知りたい場合は、中央値を再計算する必要はありません。必要な値を削除した後も、古い中央値よりも高い/低いケースは、新しい中央値よりも高い/低いままになります。つまり、基本的に、JamesとJohnのコードは技術的にはあなたが要求したことを実行しませんが、違いはありません。実際、後でデータフレームを再構築するのが簡単になります。

これが機能しなくなったのは、値が1つ残っている場合(中央値になり、理論的に結果がないように削除する必要がある場合のみです。rt1のサブジェクト1を参照)、またはすべての値が等しい(この場合、すべての値が削除され、結果はありません)。

于 2010-10-15T11:46:54.783 に答える
2

ジョンの回答に続いて、主題ごとの中央値を実行するには、次を使用しますtapply

test2 <- data.frame(test)
test2$subject <- factor(test2$subject)
test3 <- data.frame(subject=levels(test2$subject),median.rt1=tapply(test2$rt1,test2$subject,median),median.rt2=tapply(test2$rt2,test2$subject,median))
test2 <- merge(test2,test3)
test2$speed1 <- ifelse(test2$rt1 < test2$median.rt1, 'fast', 'slow') 
test2$speed2 <- ifelse(test2$rt2 < test2$median.rt2, 'fast', 'slow')

使用できる中央値の値を削除するには、

subset(test2,!(rt1==median.rt1 | rt2==median.rt2))

または、数値表現エラーが真っ直ぐな等式テストで問題を引き起こすと予想される場合は、許容誤差ベースのテスト。tapply次に、 and行を再度実行してmerge(元の中央値列をサブセット化する可能性がありますが)、新しい中央値を計算し、必要に応じて速度分類をやり直すことができます。個人的には、ネストifelseを使用して、高速、低速、または平均として分類します。

于 2010-10-15T10:32:35.937 に答える