如何在 dplyr 链中对整个表格应用一个函数

7
我有一个如下的dplyr链:
myResults <- rawData %>% filter(stuff) %>% mutate(stuff)

现在我想将函数myFunc应用于myResults。有没有一种方法可以在链中完成,还是基本上需要做以下操作:
myResults <- myFunc(myResult)
2个回答

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 

值得一提的是,dplyr 使用的 magrittr::%>% 可以与任何参数一起使用,因此您可以轻松地执行以下操作:
> 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,则可能会看起来更好。在我看来,看到空参数列表意味着没有处理任何内容,但这可能只是审美上的小问题。 - IRTFM
“apply” 的输出更容易复制和粘贴,但你当然是正确的。 - zero323
好的,如果你想要一个向量结果,那就使用sapply。R的早期用户总是首先使用apply,他们需要被告知它常常会产生不可预知的后果。 - IRTFM

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接