dplyr和可重用的参数列表

时间:2014-01-19 14:27:47

标签: r dplyr

我已经和dplyr玩了一点,非常喜欢它。我错过了一些东西。在plyr中,我能够将函数传递给ddply并重用它。

library('dplyr')
library('plyr')

fn = function(df) {
    summarise(df,
        count = length(id))
}

ddply(DF1,'group', fn)
ddply(DF2,'group', fn)

因此,我可以将一长串录音应用于多个数据集,而无需复制summarise的所有参数。但是,在dplyr中,我必须这样做

dplyr::summarise(group_by(DF1,group),
    count = length(id))
dplyr::summarise(group_by(DF2,group),
    count = length(id))

因此每次都必须重复summarise的参数。 list('.data'=DF1,'count'=length(id))do.call的参数列表不起作用,因为在定义参数列表时会评估length(id)。对此有什么解决方案吗?

2 个答案:

答案 0 :(得分:8)

我喜欢@RomanLustrik的答案,所以这是他的答案的100%dplyr方法。

do(mylist, function(df)
   df %.%
   group_by(b) %.%
   summarise(count = n()))

## [[1]]
## Source: local data frame [2 x 2]

##   b count
## 1 b     5
## 2 a     5

## [[2]]
## Source: local data frame [2 x 2]

##   b count
## 1 b     5
## 2 a     5

在这个答案中,我只是试图复制Roman的方法,但你可以重用你的函数(fn):

fn <- function(df) {
    summarise(df,
        count = n())
}

group_by(df1, b) %.% fn()
## Source: local data frame [2 x 2]

##   b count
## 1 b     5
## 2 a     5

group_by(df2, b) %.% fn()
## Source: local data frame [2 x 2]

##   b count
## 1 b     5
## 2 a     5

你甚至可以像这样包装它

do(list(df1, df2), function(df) group_by(df, b) %.% fn())

答案 1 :(得分:3)

这就是你要追求的吗?

df1 <- df2 <- data.frame(a = runif(10), b = rep(c("a", "b"), each = 5))

library(dplyr)

mylist <- list(df1, df2)
lapply(mylist, FUN = function(x) {
  dplyr::summarise(group_by(x, b),
                   count = length(b))
})
[[1]]
Source: local data frame [2 x 2]

  b count
1 a     5
2 b     5

[[2]]
Source: local data frame [2 x 2]

  b count
1 a     5
2 b     5