dplyr - 从group_by到自己的函数

时间:2015-02-11 06:06:31

标签: r

这很可能是其中任何一个或两个的重复,如果有这样的道歉,我想这会使它成为一个突出的燃烧问题。

https://stackoverflow.com/questions/28388211/in-r-package-dplyr-how-to-use-own-defined-function-to-summarise-each

pass grouped dataframe to own function in dplyr

使用plyr可以运行这样的东西:

ddply(mtcars, .(cyl), function(x) table(x$am))

并获得不错的输出

> ddply(mtcars, .(cyl), function(x) table(x$am))
  cyl  0 1
1   4  3 8
2   6  4 3
3   8 12 2

我仍然不明白为什么ddply(mtcars, .(cyl), table(am))无法正常工作,但从未明白过。

有没有办法在dplyr中实现上述目标?

mtcars %>%
  group_by(cyl) %>%
  function(x) table(x$am)

没有达到相同的效果。

更新的问题(出于历史目的而保留上述内容)。

事后看来,虽然以上是我不时想做的事情,但我更想尝试这样的功能:

blah <- function(x) {
  x$position <- 1:nrow(x)
  x$count <- nrow(x)
  return(x)
}

ddply(mtcars, .(cyl,am), function(x) blah(x))

1 个答案:

答案 0 :(得分:3)

将我和docendo的评论转化为答案,这就是do()的用途。

mtcars %>% group_by(cyl, am) %>% do(blah(.))
# same results as
plyr::ddply(mtcars, plyr::.(cyl, am), function(x) blah(x))
# same as plyr with no anonymous function in this case
plyr::ddply(mtcars, plyr::.(cyl, am), blah)

由于blah占用了您的完整数据框(至少在列方面)并返回数据框,因此您不需要匿名函数调用。

dplyrddply之间有很多相似之处,如果要添加列,则使用mutate,如果要使用聚合函数折叠分组变量,则使用{{ 1}}。 summarise是dplyr等价于为每个数据做一些其他事情,但它需要返回一个数据框。