2

在 ddply 的以下代码中:

ddply(df, .(groupA), summarise, x=sum(x)/sum(a), y=sum(x)/sum(b))

当您运行上述函数来计算yvalue bysum(x)/sum(b)时,您不会得到想要得到的结果而是 get sum(sum(x)/sum(a))/sum(b),因为x在 中被覆盖x=sum(x)/sum(a)并且原始 dfx不再可用。

那么如何不使用新计算的x值,而是使用原始 df'sx呢?我记得这个功能以前没有实现,是在 2011 年或 2012 年的某个时候添加的。但是,我不记得它的功能是什么时候添加的,也没有找到相关文档,所以有人可以在这里帮助我吗?如果我没记错的话,我认为有一些方法可以解决这个问题......

谢谢。

[更新]

以 SimonO101 为例,这两个代码返回不同的结果:

ddply(mtcars,.(cyl),summarise,x=mean(hp/wt))
ddply(mtcars,.(cyl),summarise,hp=mean(hp),wt=mean(wt),x=mean(hp/wt))

,因为第二个函数从刚刚计算的and中获取hpand的值,而不是原始 df 的and 。所以我想知道如何避免名称冲突而不避免将这些列命名为与原始列相同的名称。wtmean(hp)mean(wt)hpwt

4

1 回答 1

1

在您的示例中(但可能并不总是)工作得很好的一个简单解决方案是切换语句的顺序:

library(plyr)
d1 <- ddply(mtcars,.(cyl),summarise,
        x=mean(hp/wt),  ## do this first!
        hp=mean(hp),
        wt=mean(wt))
## check
d1[d1$cyl=="4","x"] == with(subset(mtcars,cyl==4),mean(hp/wt))

我通常会像上面的评论一样给自己留一个小便条,这样我就不会在将来的某个时候忘记并切换顺序(并把自己搞糊涂)。

http://r4stats.com/2013/01/22/comparing-transformation-styles/是一个有用的讨论。

于 2013-11-08T02:01:00.430 回答