很容易在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的函数,那么也有效。
编辑:要清楚,驱动这个的真正应用程序不是总和,但这是一个更容易的解释
答案 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