2015-06-20 73 views
7

功能適用於整個表我有一個dplyr鏈如下如何在dplyr鏈

myResults <- rawData %>% filter(stuff) %>% mutate(stuff) 

現在我想一個函數myFunc適用於myResults。有沒有辦法做到這一點鏈或做我需要做的基本上都是:

myResults <- myFunc(myResult) 

回答

5

如果函數需要一個數據幀作爲第一個參數,你可以簡單的在末尾添加它。

> myFunc <- function(x) sapply(x, max) 
> mtcars %>% filter(mpg > 20) %>% myFunc() 
    mpg  cyl disp  hp drat  wt qsec  vs  am gear 
33.900 6.000 258.000 113.000 4.930 3.215 22.900 1.000 1.000 5.000 
    carb 
    4.000 

值得一提的是magrittr::%>%它使用dplyr作品與任何參數,因此您可以輕鬆地做這樣的事情:

> inc <- function(x) x + 1 
> 1 %>% inc(.) %>% sqrt(.) %>% log(.) 
[1] 0.3465736 

,並與一些有用的magrittr別名:

library(magrittr) 
set.seed(1) 
inTrain <- sample(1:nrow(mtcars), 20) 
mtcarsTest <- mtcars %>% extract(-inTrain,) 

summaryPipe <- function(x) {print(summary(x)); x} 

mtcars %>% 
    extract(inTrain,) %>% 
    # Train lm 
    lm(mpg ~ ., .) %>% 
    # Print summary and forward lm results 
    summaryPipe %>% 
    # Predict on the test set 
    predict(newdata = mtcarsTest) %>% 
    # Print results and forward arguments 
    print %>% 
    # Compute RMSE 
    subtract(mtcarsTest %>% extract2('mpg')) %>% 
    raise_to_power(2) %>% 
    mean %>% 
    sqrt 

這可能是一個品味的問題,但我個人認爲它相當有用。

由於@BondedDust在評論中提到有傳遞函數%>%的三種可能的方式。有了點佔位符,你可以在比第一不同的位置使用LHS(見lm調用)。

+2

的一個子集,我不知道有多少它在這種情況下很重要,但在示例函數的主體中使用'lapply(x,max)'而不是'apply'調用可能更有效。如果你使用'%>%myFunc(。)'或者只是'%>%myFunc'完成它可能會更好。我的眼睛,看到一個空的參數列表表明,沒有什麼是正在處理,但是這也許只是一個審美的狡辯 –

+0

'apply'輸出只是更容易複製和粘貼,當然,你說得對。 – zero323

+0

好的,如果你想要一個向量結果,那麼使用'sapply'。 R的早期使用者永遠都會首先申請'應用',他們需要提醒他們經常會有不良後果 –

1

您可以使用現有的功能summarise_eachmutate_each適用於所有列或列select

library(dplyr) 
    mtcars %>% 
    filter(mpg > 20) %>% 
    summarise_each(funs(max)) 
    # mpg cyl disp hp drat wt qsec vs am gear carb 
    #1 33.9 6 258 113 4.93 3.215 22.9 1 1 5 4 

或者通過外部函數

myFunc1 <- function(x) max(x) 
    mtcars %>% 
    filter(mpg > 20) %>% 
    summarise_each(funs(myFunc1)) 
# mpg cyl disp hp drat wt qsec vs am gear carb 
#1 33.9 6 258 113 4.93 3.215 22.9 1 1 5 4