如何将函数应用于dplyr链中的整个表

use*_*015 7 r dplyr

我有一个dplyr链如下

myResults <- rawData %>% filter(stuff) %>% mutate(stuff)
Run Code Online (Sandbox Code Playgroud)

现在我想的功能应用myFuncmyResults.有没有办法在链中做到这一点,或者我是否需要基本做到:

myResults <- myFunc(myResult)
Run Code Online (Sandbox Code Playgroud)

zer*_*323 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 
Run Code Online (Sandbox Code Playgroud)

值得一提的magrittr::%>%dplyr,任何参数都可以使用,因此您可以轻松地执行以下操作:

> inc <- function(x) x + 1
> 1 %>% inc(.) %>% sqrt(.) %>% log(.)
[1] 0.3465736
Run Code Online (Sandbox Code Playgroud)

并使用一些有用的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
Run Code Online (Sandbox Code Playgroud)

这可能是一个品味问题,但我个人觉得它很有用.

正如@BondedDust在评论中提到的,有三种方法可以将函数传递给%>%.使用点占位符,您可以在与第一个不同的位置使用LHS(请参阅lm调用).

  • 在这种情况下,我不知道它有多重要,但在该示例函数的主体中使用`lapply(x,max)`而不是`apply`调用可能更有效.如果用`%>%myFunc(.)`或只是'%>%myFunc`来做它可能看起来更好.在我看来,看到一个空的参数列表表明没有任何东西正在被处理,但这可能只是一个美学狡辩 (2认同)