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

时间:2015-06-20 00:04:53

标签: r dplyr

我有一个dplyr链如下

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

现在我想将一个函数myFunc应用于myResults。有没有办法在链中做到这一点,或者我需要基本上做:

myResults <- myFunc(myResult)

2 个答案:

答案 0 :(得分: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调用)。

答案 1 :(得分: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