2016-09-28 30 views
2

data.tableを使用していくつかの変数をいくつかのグループ変数で標準化できますか?data.tableを使用してグループごとに標準化する

DT <- data.table(V1=1:20, V2=40:21, gr=c(rep(c('a'),10), rep(c('b'),10)), 
      grr=rep(c(rep(c('a'),5), rep(c('b'),5)),2)) 

grとgrrはグループ変数です。それぞれのgr-by-grrグループ内の標準化されたスコアであるdata.table V1.zとV2.zを追加したいと思います。ここで

は私が欲しいものを説明するために、そのための非常に愚かなコードです:

DTaa <- DT[gr=='a' & grr=='a',] 
DTab <- DT[gr=='a' & grr=='b',] 
DTba <- DT[gr=='b' & grr=='a',] 
DTbb <- DT[gr=='b' & grr=='b',] 
DTaa <- DTaa[,V1.z := scale(V1)] 
DTaa <- DTaa[,V2.z := scale(V2)] 
DTab <- DTab[,V1.z := scale(V1)] 
DTab <- DTab[,V2.z := scale(V2)] 
DTba <- DTba[,V1.z := scale(V1)] 
DTba <- DTba[,V2.z := scale(V2)] 
DTbb <- DTbb[,V1.z := scale(V1)] 
DTbb <- DTbb[,V2.z := scale(V2)] 
DTn <- rbind(DTaa, DTab, DTba, DTbb) 

おそらく、1でbyまたは2行を使用してそれを実行する方法があります。

  • 私は、データ、ターゲット変数(例ではV1とV2)、グループ変数(例ではgrとgrr)を引数として受け入れる関数で使用したいと考えています。
  • data.tableを使用しないソリューションをお持ちの場合は、それも良いです(私はdplyrのmutate_atを使用しようとしましたが、その関数に関する多くのドキュメントは見つかりませんでした)。

答えて

3

「GR」と「GRR」、Data.tableのサブセット(.SD)、上ループscaleそれ(scaleの出力がmatrixであるので、我々は、as.vectorvectorに変換)によってグループ化した後新しい列に出力を割り当てます(:=)。

DT[, paste0(names(DT)[1:2], ".z") := lapply(.SD, 
        function(x) as.vector(scale(x))), .(gr, grr)] 
+0

@YBAあなたにはうってつけの喜び。また、ガイドライン[here](http://stackoverflow.com/help/someone-answers) – akrun

+0

をお読みください。ありがとう。 フォローアップの質問: 私はV3とV4をdata.tableに追加しましたが、あなたのコードはまだ最初の2つの変数だけを変換することを知っていました。それはいいですが、どうしましたか?つまり、data.tableは、第1列と第2列だけでアクションを実行することをどのようにしたいのですか?私がここに見ているのはpaste0ですが、それは新しい変数の名前だけです。列1と列2の名前を使用し、列3と列4のアクションを実行する場合はどうしたらいいですか? – YBA

+0

@YBA一般に、 '.SD'は' by'カラムで指定されていないすべてのカラム、すなわち '(gr、grr)'を含みます。他の列があり、 'V1'と 'V2'だけを行い、 '.SDcols'でそれらを指定すると' .SDcols = V1:V2'とし、 '.SD'をループします。ポスト。 – akrun

関連する問題