ddply中的mapply

时间:2012-01-06 22:58:21

标签: r dataframe plyr

注意:这是此previous question

的直接跟进

我有很长的数据帧,包含两列,我用作函数的参数,它将使用mapply找到第三列的值:

df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd)

其中myfunction有参数A和B.虽然这适用于小型数据集,但是对于大型数据集而言却停滞不前,因此我认为解决问题的一个好方法是使用{{1}来应用此函数}。我不知道ddply是否是解决此问题的最佳方法,但我在语法方面也遇到了一些问题。因此,对任何一方的建议都表示赞赏。

这就是我的尝试:

ddply

这是我得到的错误:

> df$3rd <- ddply(df, .(1st), function(x) x$3rd <-
> mapply(myfunction, A=x$1st, B=df$second))

编辑:



根据答案和评论我将在下面发布一个可重复的小例子 - 这是上一个问题的答案之一。然而,正如下面的评论者所说,ddply可能不是那样的。我现在正在尝试Ramnath的解决方案。

Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L,  : 
  replacement has 112 rows, data has 16

1 个答案:

答案 0 :(得分:4)

ddply不是你在这里所追求的,ddply(df,.(1st), FUNCTION)更像是:

for each val in unique(df$1st)
    outdf[nrow(outdf)+1,] = FUNCTION( df[df$1st==val] )

也就是说,它使outdfFUNCTION组成,应用于由df列确定的​​1st子集。

在任何情况下,我认为您的错误可能是因为dfx参数)中有function(x) x$3rd<-mapply(myfunction,A=x$1st, B=df$second)而不是B?虽然没有一个有效的例子很难分辨。

myfunction究竟做了什么?我认为你最好的选择是 vectorise myfunction,这样你就可以df$third <- myfunction( A=df$first, B=df$second )

例如,如果myfunction <- function(A,B) { A+B },而不是mapply(myfunction,df$first,df$second),则可以等同地执行myfunction(df$first,df$second),甚至根本不需要mapply。