如何不使用“刚刚计算”的值来计算plyr / ddply中的“下一个”值

时间:2013-11-07 23:13:14

标签: r plyr

在ddply的以下代码中:

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

当您运行上述函数以y计算sum(x)/sum(b)值时,您将无法获得您想要获得的内容而是获得sum(sum(x)/sum(a))/sum(b),因为x是在x=sum(x)/sum(a)中覆盖,原来的df x已不再可用。

那么如何不使用新计算的x值而是使用原始df的x?我记得以前没有实现过这个功能,并且在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))

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

1 个答案:

答案 0 :(得分: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-tranformation-styles/是一个有用的讨论。