如何将函数应用于dplyr链中的整个表
我有一个dplyr链,如下所示如何将函数应用于dplyr链中的整个表,r,dplyr,R,Dplyr,我有一个dplyr链,如下所示 myResults <- rawData %>% filter(stuff) %>% mutate(stuff) 如果函数将dataframe作为第一个参数,则可以简单地将其添加到末尾 > myFunc <- function(x) sapply(x, max) > mtcars %>% filter(mpg > 20) %>% myFunc() mpg cyl disp
myResults <- rawData %>% filter(stuff) %>% mutate(stuff)
如果函数将dataframe作为第一个参数,则可以简单地将其添加到末尾
> 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
别名:
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
库(magrittr)
种子(1)
内部单位%
#列车长
lm(mpg~,)%>%
#打印摘要并转发lm结果
汇总管道%>%
#在测试集上预测
预测(新数据=mtcarsTest)%>%
#打印结果并转发参数
打印%>%
#计算RMSE
减去(mtcarsTest%>%extract2('mpg'))%>%
提高功率(2)%>%
平均%>%
sqrt
这可能是一个品味的问题,但我个人觉得它相当有用
正如注释中提到的@BondedDust,有三种可能的方法可以将函数传递给
%>%
。使用点占位符,您可以在与第一个不同的位置使用LHS(请参见lm
call)。您可以使用现有函数summary\u each
或mutate\u each
应用于所有列或选择列的子集
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
myFunc1%
过滤器(mpg>20)%>%
每个人的总结(funs(myFunc1))
#mpg气缸显示hp drat wt qsec与am齿轮carb
#1 33.9 6 258 113 4.93 3.215 22.9 1 1 5 4
我不知道在这种情况下它有多重要,但是使用lappy(x,max)
可能比使用该示例函数体中的apply
调用更有效。如果您使用%%>%myFunc(.)
或仅使用%%>%myFunc
,效果可能会更好。在我看来,看到一个空的参数列表表明没有任何处理,但这可能只是一个美学上的诡辩apply
输出只是更容易复制和粘贴,但当然你是对的。好的,如果你想要向量结果,那么使用sapply
。R的早期用户总是首先使用apply
,他们需要得到警告,这通常会产生不良后果
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