是否可以使用transform添加data.frame上每行操作的结果?

是否可以使用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

我有点困惑。我经常这样使用transform

    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