在函数中获取并处理ddply中的整行

时间:2011-03-18 19:38:36

标签: r plyr

很容易在ddply中抓取一个或多个进行处理,但有没有办法抓取整个当前行并将其传递给函数?或者获取在运行时确定的一组列?

让我说明一下:

给出类似

的数据框
df = data.frame(a=seq(1,20), b=seq(1,5), c= seq(5,1))
df
    a b c
1   1 1 5
2   2 2 4
3   3 3 3

我可以编写一个函数来对数据框的一行中的命名列求和,如下所示:

selectiveSummer = function(row,colsToSum) {
   return(sum(row[,colsToSum])) 
}

当我把它称为像这样的行时,它可以工作:

> selectiveSummer(df[1,],c('a','c'))
[1] 6

所以我想把它包装在一个匿名函数中,并在ddply中使用它将它应用到表中的每一行,类似下面的例子

f = function(x) { selectiveSummer(x,c('a','c')) }
#this doesn't work!
ddply(df,.(a,b,c), transform, foo=f(row))

我想找到一个解决方案,其中可以在运行时确定要操作的列集,所以如果有某种方法只是从ddply的args中删除它并将其传递给一个带有任意数量的args的函数,那么也有效。

编辑:要清楚,驱动这个的真正应用程序不是总和,但这是一个更容易的解释

1 个答案:

答案 0 :(得分:4)

如果可以使用一个或多个变量以唯一方式标识行,则只能使用ddply选择单行。如果存在相同的行,即使您使用所有列(例如ddply(df, names(df), f),ddply也会在多行的数据帧上循环。

为什么不使用申请? Apply会迭代各行。

apply(df, 1, function(x) f(as.data.frame(t(x)))))

结果:

[1]  6  6  6  6  6 11 11 11 11 11 16 16 16 16 16 21 21 21 21 21