Как определить функцию в dplyr? - Добавление результатов теста хи-квадрат

Я пытаюсь написать функцию, которая даст мне сводную таблицу для двух переменных. Расширяя свой вопрос здесь, я хотел бы включить значение p теста хи-квадрат для связи между предиктором и целью, а также. Как мне изменить функцию?

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)

# 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)
}

Вот мой рабочий пример:

mtcars %>%
  group_by(as.factor(cyl)) %>%
  summarise(sum=sum(mpg_cat),total=n(),
            pvalue= chisq.test(as.factor(.$mpg_cat), as.factor(.$cyl))$p.value) %>% 
  mutate(percentage=sum*100/total)

Я попробовал следующую функцию, но она не сработала.

get_pivot <- function(data, predictor,target) {
  result <-
    data %>%
    group_by( {{ predictor }} ) %>%
    summarise(clicks=sum( {{ target }} ),total=n(),
              pvalue= chisq.test(.$target, .$predictor)$p.value) %>%
    mutate(percentage=clicks*100/total);

  print(result)
}

person Hamideh    schedule 15.07.2019    source источник
comment
Помимо ответа @akrun, взгляните на эту страницу!   -  person patL    schedule 15.07.2019


Ответы (1)


Оператор интерполяции {{...}} curly-curly — удобный способ для кавычек-без кавычек. Но это не будет работать во всех случаях. В функции OP столбец извлекается с помощью $, т.е. часть .$target или .$predictor не будет работать. Вместо этого мы могли бы преобразовать его в character (as_name), а затем извлечь столбец с [[.

library(rlang)
library(dplyr)

get_pivot <- function(data, predictor,target) {

     data %>%
     group_by( {{ predictor }} ) %>%
     summarise(clicks=sum( {{ target }} ),total=n(),
               pvalue= chisq.test(.[[as_name(enquo(target))]], 
                       .[[as_name(enquo(predictor))]])$p.value) %>%
     mutate(percentage=clicks*100/total);


 }

get_pivot(mtcars, cyl, mpg_cat)
# A tibble: 3 x 5
#    cyl clicks total     pvalue percentage
#  <dbl>  <dbl> <int>      <dbl>      <dbl>
#1     4     11    11 0.00000366      100  
#2     6      3     7 0.00000366       42.9
#3     8      0    14 0.00000366        0  
person akrun    schedule 15.07.2019