2014-01-19 30 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