簡體   English   中英

如何在dplyr中定義一個函數?

[英]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) 這種做法通常使“交互式”代碼更短,更簡單,更易於閱讀,但代價是使編程更復雜。 在這種情況下, {{ }}運算符用於將您指定的列傳輸到函數的上下文中。

https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM