Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将函数应用于dplyr链中的整个表_R_Dplyr - Fatal编程技术网

如何将函数应用于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

我有一个dplyr链,如下所示

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