![](/img/trans.png)
[英]How to apply a function per group in dplyr without having to define a function?
[英]How to define a function in dplyr?
我在R的dplyr
包中創建了一個簡單的數據透視表。這是我的工作示例:
library(dplyr)
mean_mpg <- mean(mtcars$mpg)
# creating a new variable that shows that Miles/(US) gallon is greater than the mean or not
mtcars <-
mtcars %>%
mutate(mpg_cat = ifelse(mpg > mean_mpg, 1,0))
mtcars %>%
group_by(as.factor(cyl)) %>%
summarise(sum=sum(mpg_cat),total=n()) %>%
mutate(percentage=sum*100/total)
現在,我想編寫一個函數來重用這段代碼:
get_pivot <- function(data, predictor,target) {
result <-
data %>%
group_by(as.factor(predictor)) %>%
summarise(sum=sum(target),total=n()) %>%
mutate(percentage=sum*100/total);
print(result)
}
但是我收到以下錯誤:
is.factor(x)出錯:找不到對象'cyl'
我也試過了
get_pivot(mtcars, "cyl", "mpg_cat" )
但它不起作用。
我該怎么辦?
如果您擁有最新的rlang
庫更新v0。4。0(2019年6月),則可以使用雙花括號{{ }}
(又名“卷曲”)來更輕松地使用dplyr進行編程。
# Note: needs installation of rlang 0.4.0 or later
get_pivot <- function(data, predictor,target) {
result <-
data %>%
group_by(as.factor( {{ predictor }} )) %>%
summarise(sum=sum( {{ target }} ),total=n()) %>%
mutate(percentage=sum*100/total);
print(result)
}
# Edit -- thank you Rui Barradas
> get_pivot(mtcars, cyl, mpg_cat)
# A tibble: 3 x 4
`as.factor(cyl)` sum total percentage
<fct> <dbl> <int> <dbl>
1 4 11 11 100
2 6 3 7 42.9
3 8 0 14 0
這是必需的原因是dplyr
和其他tidyverse
包使用“非標准評估”,就像你遇到一些基本R函數,如lm(mpg~factor(am),data=mtcars)
。 這種做法通常使“交互式”代碼更短,更簡單,更易於閱讀,但代價是使編程更復雜。 在這種情況下, {{ }}
運算符用於將您指定的列傳輸到函數的上下文中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.