2

データフレームには、いくつかの値を持つベクトルと、各値が属するカテゴリのベクトルがあります。「カテゴリごと」に動作する関数を値に適用したいので、tapplyを使用します。たとえば、私の場合、各カテゴリ内の値を再スケーリングしたいと考えています。

ただし、tapply の結果は再スケーリングされた値のベクトルのリストですが、このリストを統合 (または「線形化」) する必要があるため、再スケーリングされた値の列をデータ フレームに追加できます。

私はそれを行う簡単な方法を探しています。ここにサンプルがあります:

x = 1:10
c = factor(c(1,2,1,2,1,2,1,2,1,2))
#I do the rescaling like this:
rescaled = tapply(x,list(c),function(x) as.vector(scale(x)))
# this look like this:
$`1`
[1] -1.2649111 -0.6324555  0.0000000  0.6324555  1.2649111

$`2`
[1] -1.2649111 -0.6324555  0.0000000  0.6324555  1.2649111


# but really, I need to get something like this
[1] -1.2649111 -1.2649111 -0.6324555 -0.6324555  0.0000000  0.0000000
 [7]  0.6324555  0.6324555  1.2649111  1.2649111

助言がありますか?

ありがとう、アミット

4

1 に答える 1

7

主力製品のもう 1 つの仕事ave。データフレームでそれを説明しましょう:

> mydf <- data.frame(x=1:10,myfac=factor(c(1,2,1,2,1,2,1,2,1,2)))
> within(mydf, scaledx <- ave(x,myfac,FUN=scale))
    x myfac    scaledx
1   1     1 -1.2649111
2   2     2 -1.2649111
3   3     1 -0.6324555
4   4     2 -0.6324555
5   5     1  0.0000000
6   6     2  0.0000000
7   7     1  0.6324555
8   8     2  0.6324555
9   9     1  1.2649111
10 10     2  1.2649111

を見ると?ave、因子のリストを使用してこれを行うこともできることがわかります。データフレームに列を追加したい場合、これが最も簡潔な (最速ではありませんが) 方法です。と組み合わせるとwithin、1 行のコードで両方の操作を実行できます。

于 2013-02-05T15:54:05.893 に答える