4

次の例のように、ddplyを使用しているスクリプトがあります。

ddply(df, .(col),
function(x) data.frame(
col1=some_function(x$y),
col2=some_other_function(x$y)
)
)

ddply内で、関数全体を再度呼び出さずにcol1を再利用することは可能ですか?

例えば:

ddply(df, .(col),
function(x) data.frame(
col1=some_function(x$y),
col2=some_other_function(x$y)
col3=col1*col2
)
)
4

3 に答える 3

5

あなたは遊ぶための機能全体を持っています!ワンライナーである必要はありません!これはうまくいくはずです:

ddply(df, .(col), function(x) {
  tmp <- some_other_function(x$y)
  data.frame(
    col1=some_function(x$y),
    col2=tmp,
    col3=tmp
  )
})
于 2010-07-30T19:19:31.237 に答える
3

これは、コンポーネントdata.tableのスコープ ルールを使用するための適切な候補のようです。j詳細については、FAQ 2.8 を参照してください

よくある質問から

j には匿名関数は渡されません。代わりに、匿名の本体が j に渡されます。

だから、あなたの場合

library(data.table)
DT <- as.data.table(df)
DT[,{
 col1=some_function(y)
 col2=some_other_function(y)
 col3= col1 *col2
 list(col1 = col1, col2 = col2, col3 = col3)
 }, by = col]  

またはもう少し直接的な方法:

DT[,list(
 col1=col1<-some_function(y)
 col2=col2<-some_other_function(y)
 col3=col1*col2
 ), by = col]  

これにより、 と のそれぞれ 1 回の繰り返しがcol1回避され、 ;col2の 2 回の繰り返しが回避されます。col3繰り返しは、私たちが削減しようと努力しているものですdata.table。後=に続くは、<-最初は面倒に見えるかもしれません。ただし、次の構文シュガーが許可されます。

DT[,list(
 "Projected return (%)"=      col1<-some_function(y),
 "Investment ($m)"=           col2<-some_other_function(y),
 "Return on Investment ($m)"= col1*col2
 ), by = col]  

たとえば、出力を直接 latex や html に送信できます。

于 2012-09-20T04:31:11.247 に答える
2

それは不可能だと思いますが、その時点ではもはや集計関数ではないので、それほど重要ではありません。例えば:

#use summarize() in ddply()
data.means <- ddply(data, .(groups), summarize, mean = mean(x), sd = sd(x), n = length(x))
data.means$se <- data.means$sd / sqrt(data.means$n)
data.means$Upper <- data.means$mean + (data.means$SE * 1.96)
data.means$Lower <- data.means$mean - (data.means$SE * 1.96)

したがって、SEを直接計算しませんでしたが、の外で計算するのはそれほど悪くありませんでしたddply()。あなたが本当にしたいのなら、あなたもすることができます

ddply(data, .(groups), summarize, se = sd(x) / sqrt(length(x)))

またはあなたの例の観点からそれを置くために

ddply(df, .(col), summarize,
      col1=some_function(y),
      col2=some_other_function(y)
      col3=some_function(y)*some_other_function(y)
    )
于 2010-07-30T15:02:12.520 に答える