【问题标题】:dplyr - from group_by into own functiondplyr - 从 group_by 到自己的函数
【发布时间】:2015-02-11 06:06:30
【问题描述】:

这很可能是其中一个或两个的副本,如果这样道歉,我想这将使它成为一个突出的紧迫问题。

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 one 可以运行如下:

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))

【问题讨论】:

  • 我认为do() 是您问题的一般答案,但是这个例子很痛苦,因为table 不返回数据框,也不是那么容易转换为你想要的数据框。
  • 这只是一个通用的、可重复的示例,用于编码目的。我想把它推到桌子之外。
  • 已经更新了这个问题,考虑到表格的细微差别,这使得它有所不同,但仍然达到了相同的宽泛点。
  • 正如 Gregor 所说,在这种情况下您可以使用do。使用blah 函数,它将是mtcars %&gt;% group_by(cyl, am) %&gt;% do(blah(.))

标签: r


【解决方案1】:

将我和 docendo 的 cmets 变成答案,这就是 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,如果要使用聚合函数折叠分组变量,请使用 summarisedo 相当于 dplyr 对每条数据执行其他操作,但它需要返回一个数据帧。

【讨论】:

  • 谢谢格雷戈尔。您是否知道在问题的第一部分中使用表格的方法?鉴于表不返回数据框,显然不会工作。除非有更好的功能来获得像(交叉表)输出一样的“表格”?我通常使用 catspec 中的 ctab,但也会遇到同样的问题。
  • do() 显然只是错过了介绍小插曲的剪辑 :) cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html
  • @nzcoops 这不是 dplyr 集成最干净的文章,而是 here's an example 使用 reshape2::dcastfun.aggregate = length()。 (巧合的是,这是我在此之前回答的问题。)
猜你喜欢
  • 2014-06-04
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2016-11-26
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多