3

在 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 的函数,那也可以。

编辑:需要明确的是,驱动这个的真正应用程序不是总和,但这是一个更简单的解释

4

2 回答 2

4

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

为什么不使用 apply 呢?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
于 2011-03-30T11:49:53.927 回答
0

简单的...

df$id = 1:nrow(df)
ddply(df,c('id'),function(x){ ... })

或者

adply(df,1,function(x){ ... })
于 2015-05-03T11:59:28.803 回答