2012-02-23 4 views
3

私はRプログラミングの初心者で、基本的なコードに問題があります。行のサブセットのzスコアを作成する

私は、条件(因子)、ユーザ(因子)、感度(int)の列を持つデータフレームを持っています。各ユーザーには、20の感応項目があります。各ユーザーの標準化された感度スコアを持つ新しい列を作成する必要があります。この方法で、ユーザー間の感度スコアを比較できます。私は、ユーザーごとに各項目のzスコアを作成できるループ(または同様のもの)を書くのに問題があります。

私は14のユニークユーザー(これは増加するでしょう)に20の感応度アイテムを持っています。

ありがとうございました。

+0

例を挙げてください。特定の楽器の各ユーザーのZスコアを求めたいのですか、または各アイテムのZスコアを他の楽器と比較したいですか?いずれの場合も、ユーザーあたり20列あります。あなたは何らかの方法でそれらを組み合わせることができますが、それはデータの意味に依存します。 – ABS

答えて

1

私はplyrパッケージを見ていきます。そして、私が間違っていない限り、私はしばしば、scaleあなたが探している機能です。あなたのデータはdata.frame DFである場合:

library(plyr) 
ddply(df, .(user), function(x){x$scaled.sensitivity = scale(x$sensitivity) 
           return(x)}) 
+0

こんにちは、私はちょうど私の問題を掲載しました。同じ問題、多くのNaNを取得する – user1229433

+0

@ user1229433データのソースに戻って、数値であると予想される列が見つからない理由を調べる必要があります。同じ数のベクトルをスケーリングしようとしている場合(つまり、標準偏差がゼロの場合)のみ、NaNを取得する必要があります。 – Justin

1

この場合、ループの必要はありません。代わりにベクトル化を使用してください。のは、次のシミュレートされたデータを見てみましょう:(わからない、それは正確にあなたのデータセットを再現しますが、うまくいけば、あなたは一般的なアイデアを得るでしょう)

dfrm <- data.frame(cond=gl(2, 1, 100, labels=LETTERS[1:2]), 
        user=gl(50, 2, labels=paste("id", 1:20, sep="")), 
        sensitivity=runif(100, 1, 5)) 

zスコアを計算する場合は

dfrm$z.sensitivity <- scale(dfrm$sensitivity) 

のと同じくらい簡単ですあなたは condを条件zスコアをしたい、あなたはどちらか

with(dfrm, tapply(sensitivity, cond, scale)) 

や、plyrを使用して、

を行うことができます
ddply(dfrm, c("cond"), transform, sensitivity.z = scale(sensitivity)) 
+0

こんにちは、お返事ありがとうございます。 これはうまくいきますが、偉大なzスコア(すべてのユーザーを合わせたもの)dfrm $ z.sensitivity < - スケール(as.numeric(dfrm $ sensitivity)) ですが、試してみると ddply(toolchoice、。(user) transform、sensitivity.z = scale(as.numeric(sensitivity))) カラムにNaNがたくさんあります。私は整数としてそれを読んでいない何らかの理由でas.numericをしなければならなかった。 – user1229433

関連する問題