是否可以使用transform添加data.frame上每行操作的结果?
我有点困惑。我经常这样使用transform是否可以使用transform添加data.frame上每行操作的结果?,r,dataframe,plyr,R,Dataframe,Plyr,我有点困惑。我经常这样使用transform ddply(data.frame, 1, transform, new.column = function(old.col.1,old.col.2,...)) 这也是 但最近哈雷和哈雷说: 不要使用变换。它是一个适合交互使用的辅助函数,而不是用于编程 那么转换有什么问题?我想我现在确信这是愚蠢的: transform(data.frame,col2=fun(col1)). 但是它在ddply设置中不是很有用吗?在ddply中使用tr
ddply(data.frame, 1, transform, new.column = function(old.col.1,old.col.2,...))
这也是
但最近哈雷和哈雷说:
不要使用变换。它是一个适合交互使用的辅助函数,而不是用于编程
那么转换有什么问题?我想我现在确信这是愚蠢的:
transform(data.frame,col2=fun(col1)).
但是它在ddply设置中不是很有用吗?在
ddply
中使用transform
与将函数transform()
作为独立函数使用是有区别的。这样做更好(更快):
Mydata$col3 <- fun(Mydata$col1, Mydata$col2)
transform()
的特点是,它是专门为交互使用而编写的。如果在函数中使用它,可能会遇到麻烦。在这方面,它类似于subset()
:它们是方便的函数,但在更复杂的代码中使用既不快速也不安全
在ddply()
上意见分歧。在某些情况下,它工作得很快,并给出非常干净和可重构代码,在其他情况下,我认为这是严重的过度。code>ddply()通常在必须使用非矢量化函数时工作得更快、更轻松,在这种情况下,上述选项将无法工作。但为此,您还可以选择使用mapply:
Mynewdata <- within(Mydata, col3 <- mapply(myfun,col1,col2))
这两个函数都计算正确的结果,但是
mapply()
的计算速度更快,在这种情况下,并且保留了数据帧中观察值的顺序 好的,但是这个命令呢:“ddply(data.frame,1,transform,new.column=function(old.col.1,old.col.2,…)”?有没有一行完全相同的替代方案?谢谢你的扩展答案!我认为内部应用解决方案将很好地替代ddply转换。然而,我并没有被ddply的排序所困扰。大多数情况下,这是一个令人讨厌的问题,但不同数据之间的关联仍然没有被打乱——这当然会使ddply变得毫无用处。我也有这个问题,但在阅读了你的答案后,我仍然感到困惑。我的问题是:这两种说法在功能上是等价的吗ddply(data.frame,“var”,transform,new.col=1/x)
和transform(data.frame,new.col=1/x)
subset()肯定会死掉
Mynewdata <- within(Mydata,{
col2 <- fun1(col1)
col3 <- fun2(col1,col2)
})
Mynewdata <- within(Mydata, col3 <- mapply(myfun,col1,col2))
Mydata <- data.frame(col1=rnorm(5),col2=rpois(5,3))
myfun <- function(x,y){
if(y == 0) mean(x) else
mean(c(x,seq(1,y,by=1)))
}
code1 <- expression(Newdata <- ddply(Mydata,1,transform,col3=myfun(col1,col2)))
code2 <- expression(Newdata2 <- within(Mydata, col3 <- mapply(myfun,col1,col2)))
> benchmark(code1,code2)
test replications elapsed relative
1 code1 100 0.50 12.5
2 code2 100 0.04 1.0
Mydata Newdata2 Newdata
col1 col2 col1 col2 col3 col1 col2 col3
1 0.07060223 4 | 0.07060223 4 2.0141204 | 0.05658259 2 1.0188609
2 1.84645791 2 | 1.84645791 2 1.6154860 | 0.07060223 4 2.0141204
3 0.05658259 2 | 0.05658259 2 1.0188609 | 0.84119845 1 0.9205992
4 0.89998084 5 | 0.89998084 5 2.6499968 | 0.89998084 5 2.6499968
5 0.84119845 1 | 0.84119845 1 0.9205992 | 1.84645791 2 1.6154860