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。有关详细信息,请参阅常见问题解答 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]  

col1这避免了和的每个重复col2,并避免了 ; 的两次重复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 回答