功能適用於整個表我有一個dplyr鏈如下如何在dplyr鏈
myResults <- rawData %>% filter(stuff) %>% mutate(stuff)
現在我想一個函數myFunc
適用於myResults
。有沒有辦法做到這一點鏈或做我需要做的基本上都是:
myResults <- myFunc(myResult)
功能適用於整個表我有一個dplyr鏈如下如何在dplyr鏈
myResults <- rawData %>% filter(stuff) %>% mutate(stuff)
現在我想一個函數myFunc
適用於myResults
。有沒有辦法做到這一點鏈或做我需要做的基本上都是:
myResults <- myFunc(myResult)
如果函數需要一個數據幀作爲第一個參數,你可以簡單的在末尾添加它。
> 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
調用)。
您可以使用現有的功能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
的一個子集,我不知道有多少它在這種情況下很重要,但在示例函數的主體中使用'lapply(x,max)'而不是'apply'調用可能更有效。如果你使用'%>%myFunc(。)'或者只是'%>%myFunc'完成它可能會更好。我的眼睛,看到一個空的參數列表表明,沒有什麼是正在處理,但是這也許只是一個審美的狡辯 –
'apply'輸出只是更容易複製和粘貼,當然,你說得對。 – zero323
好的,如果你想要一個向量結果,那麼使用'sapply'。 R的早期使用者永遠都會首先申請'應用',他們需要提醒他們經常會有不良後果 –