2016-04-25 18 views
1

ほとんどの数値を持つdata.tableを使用すると、列のサブセットを変換して元のデータテーブルに戻すことができますか?一般に、私は別の列として要約統計量を追加したくないだけで、変換された統計量を交換します。data.table:行、行ごとに関数を持つ列のサブセットを変換する

DTがあるとします。名前付きの1列と数値付きの10列があります。私はそのデータテーブルの各行に基底Rの "スケール"関数を使用することに興味がありますが、それらの10個の数値列にのみ適用されます。

これを拡張します。列が多いデータテーブルがあり、の列名をとすると、どのデータポイントで関数を適用するのかを教えてください。定期data.frameで

は私だけだろう:

df[,grep("keyword",colnames(df))] <- t(apply(df[,grep("keyword",colnames(df))],1,scale)) 

私はこれが面倒になります知っているが、いつも私のために働きました。しかし、私はdata.tablesでそれを行う簡単な方法を理解することはできません。

dt[,grep("keyword",colnames(dt)) := scale(grep("keyword",colnames(dt)),center=F)] 

しかし、それはない:

私は画像data.tablesのために働くためにこのような何かをだろう。

EDIT:

DT = data.tableオブジェクト

dt[,grep("keyword",colnames(dt),value=T) := as.data.table(t(apply(dt[,grep("keyword",colnames(dt)),with=F],1,scale)))] 

残念それは「とを必要とします。そのあたりの行スケーリングされたバージョンの列を更新することをやっての

もう一つの例.data.table "部分は、apply関数からの転置された値が行列であるためです。たぶん、data.tableは列の更新時に自動的にマトリックスをdata.tablesに強制する必要がありますか?

答えて

2

あなたが行によってスケールに本当に必要なものならば、あなたは2つの段階でそれをやってみてくださいすることができます助けを

# compute mean/sd: 
mean_sd <- DT[, .(mean(unlist(.SD)), sd(unlist(.SD))), by=1:nrow(DT), .SDcols=grep("keyword",colnames(DT))] 

# scale 
DT[, grep("keyword",colnames(DT), value=TRUE) := lapply(.SD, function(x) (x-mean_sd$V1)/mean_sd$V2), .SDcols=grep("keyword",colnames(DT))] 
+0

感謝を!あなたはそれを行うために短い(または一筋)方法があると思いますか?タスクの単純な性質を考えると少し精巧に見えます。 –

+1

@PiotrGrabowski、それがあなたを助けてくれたらうれしいですが、あなたのQをなぜ削除したのか分かりません。それは他人に役立つかもしれません。それはおそらく1つのライナーかもしれないが、私はそれがコードをあまり明確にしないと思う。 – Cath

+0

私はdownvoteを与えられたので、私はそれを削除したので、質問は低品質のものであると考えました。しかし、私は自分が探していたことをやり遂げるための付加的な方法を見つけました。私はオリジナルの投稿に追加します。ありがとう! –

関連する問題