「カテゴリ」グループによってdata.frameにスケーリング関数を適用しようとしています。スケーリング関数は、そのカテゴリーに応じて特定のスカラーを必要とします。計算は、 't'の各値を 'cat'の 't'の合計で割った後、 'cat'と一致するスカラー(cat = aの場合は 'fac.a'など)を乗算します。 。適用関数のグループごとにテキストで変数を取得
私は特定のスカラーを呼び出すには「取得」を使用しますが、それだけで1行目の値を使用して、全体data.frameに適用されます。
# my scaling factors:
fac.a <- 15
fac.b <- 12
fac.c <- 20
# dummy data.frame
set.seed(10)
df <- data.frame(t = sample(1:100,15),cat = rep(c("a","b","c"),each=5))
# apply function that groups & sums the df$t values by df$cat, divides each df$t by its
# repsective category total and applies the correct scalar with a get function.
df$scaled <- apply(df[1], 2, function(x) (df$t/ave(df$t, df$cat, FUN=sum))*get(paste0("fac.",df$cat)))
は、残念ながら、私は唯一の権利を取得していますget関数は第1スカラーを呼び出しているだけなので、第1カテゴリーの答え。
これは、4〜5行(別の属性の構築など)で比較的簡単に行うことができますが、私は適用機能でそれを実現したいと思います。
N.B.なぜdata.frameでは "t"という新しい属性がありますが、名前(df)を調べると "縮尺"されていますか?
うん、私はdata.tableの熱心なユーザーです、それは大好きです。しかし、私は必死にgetを使ってこのことを理解しようとしています。おそらく私はばかげていますが、それは私が解決したい問題です!あなたの答えはありがとう – Sam
@Samここでは 'apply'を使用しないほうが良いでしょう。単一の列があり、' apply'が出力を 'matrix'に変換するからです。 – akrun
大丈夫です。また、縮尺率は少し低くなります。たとえば、最初の縮尺率は3.8程度です。私はスカラーで乗算する代わりに分割したと思う、私はそれが私のやや貧しい質問であることを賭けている:) – Sam