2014-01-19 31 views
4

我已经玩了dplyr一点,真的很喜欢它。我虽然失去了一些东西。在plyr中,我能够将一个函数传递给ddply并重用它。dplyr和可重复使用的参数列表

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)在我定义参数列表时进行评估。有没有解决方案?

+0

为什么你有很多小数据框而不是一个大数据框? – hadley

回答

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 

在这个答案,我只是试图复制罗马的做法,但你可以重用功能(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

非常好的解决方案。我想不可能避免将data.frames复制到列表并获取列表? 'ddply'方法预先保存了重新编码,以便它们可以多次应用。 – user2503795

+1

@ user2503795我编辑了我的答案,检查是否是您要查找的预期结果。 – dickoa

+1

这正是我所推荐的。感谢您节省我一些打字:) – hadley

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 
+0

这类似于应用匿名/ lambda函数的问题,例如,在Python中。 – smci