我有一个dplyr链如下
myResults <- rawData %>% filter(stuff) %>% mutate(stuff)
现在我想将一个函数myFunc
应用于myResults
。有没有办法在链中做到这一点,或者我需要基本上做:
myResults <- myFunc(myResult)
答案 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_each
或mutate_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