2016-04-01 9 views
0

別の列の値に基づいてdataframeの列に値をスケーリングしたいとします。例えば、ここでは簡単な例ですRデータフレーム内の他の列の値に基づいて列をスケーリングする効率的な方法

d<-data.frame(x=runif(5,0,10),y=sample(c(1,2),size=5,replace=TRUE)) 

は出力が得られます。

  x y 
1 1.0895865 2 
2 0.8261554 2 
3 5.3503761 2 
4 3.3940759 1 
5 6.2786637 1 

私はyの値に基づいて、xの値をスケーリングしたいので、私がしたいことは持っていることです。

(x|y=1 - average(x's | y=1))/std.dev(x's|y=1) 

y=2xの値と同様に、dのx値をスケーリングされた値に置き換えます。

私がこれまでに行っていることは少し不格好です:その後、

 d1<-subset(d,y==1) 
d2<-subset(d,y==2) 

d1$x<-(d1$x-mean(d1$x))/sd(d1$x) 
d2$x<-(d2$x-mean(d2$x))/sd(d2$x) 

と一つの大きなデータフレームにすべての結果を結合、私の実際のデータは、yの50の異なる値を持っているので、これは少し面倒です複数の(異なる)列に対してこれを実行したいと思います。

require(dplyr) 
d %>% 
    group_by(y) %>% 
    mutate(x = (x - mean(x))/sd(x)) 
+1

コードに 'set.seed()'を追加して再現可能にし、期待される出力を共有してください。 – mtoto

+0

あなたは 'ave(d $ x、d $ y、FUN = function(x)(x-mean(x))/ sd(x))'を探しているかもしれません。 – nicola

答えて

2

あなたは簡単にdplyrパッケージからgroup_bymutateを使用してこれを行うことができます。 'data.frame'を 'data.table'(setDT(d))に 'b'でグループ化し、scaleの 'x'を 'x2'に(:=)割り当てます。

setDT(d)[, x2 := scale(x) , by = y] 
+0

あなたは '%>%'について説明することができますか?これは素晴らしいbtwを動作させる! – dimebucker91

+1

'%>%'は 'magrittr'の連鎖演算子です。複数の機能を連鎖させると、読みやすくなります。 '%>% 'なしで上記のコードを書くと、' mutate(group_by(d、y)、x =(x-mean(x))/ sd(x)) 'になります。基本的に 'f(x、y)'を書く代わりに 'x%>%f(y)'と書くことができます。詳細については、[ここ](https://github.com/smbache/magrittr)もチェックしてください。 – shadow

1

このタスクは、dplyr通常performy group byによってであり、我々はdata.tableを使用することができますscale

library(dplyr) 
d %>% group_by(y) %>% mutate(x2=scale(x)) 
0

を使用して:

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](/レビュー/低品質の投稿/ 11857424) –

+0

@AlessandroCuttin説明が追加されました。 – akrun