Почему функция purrr map () генерирует ошибки при попытке запустить пользовательскую функцию для повторного анализа хи-квадрат - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь использовать dplyr и purrr для программной генерации нескольких числовых анализов для многих переменных. В прошлом я просто копировал и вставлял код, но это кропотливо, и ошибки легко делаются. Мне удалось создать функцию, которая работает для создания выходной таблицы, которую я хотел бы. Однако, когда я пытаюсь использовать функцию map (), она генерирует ошибки, как показано ниже. Я думаю, что это может быть связано с синтаксисом, который я не могу понять, возможно, из-за обработки кавычек в "covariates_list". Я был бы очень благодарен за любую помощь, которую вы можете оказать мне, спасибо. Вот код с вымышленным набором данных в том же формате, что и у меня.

library(tidyverse)

# Example data input in similar format to my data
df <- data.frame(stringsAsFactors=FALSE,
           id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L,
                  15L, 16L, 17L, 18L, 19L, 20L),
           outcome = c("y", "y", "y", "y", "n", "n", "n", "y", "y", "y", "y", "y",
                       "n", "n", "n", "n", "n", "n", "n", "n"),
           covariate1 = c("y", "n", "n", "n", "n", "y", "n", "n", "n", "n", "y", "n",
                          "n", "n", "n", "y", "n", "n", "n", "y"),
           covariate2 = c("y", "y", "n", "n", "n", "y", "y", "y", "n", "n", "n", "y",
                          "n", "n", "n", "y", "n", "n", "y", "y"),
           covariate3 = c("y", "y", "n", "n", "n", "n", "n", "y", "y", "n", "y", "n",
                          "n", "n", "n", "n", "n", "n", "n", "n")
)


### Defining a function that will make a frequency table, and add a chisq p value to this.
univariate_table <- function(a,b,dat){ 
  quo_a <- enquo(a)
  quo_b <- enquo(b)
  z1 <- dat %>% count(!!quo_b,!!quo_a) 
  z2 <- sum(z1$n)
  z3 <- z1 %>% mutate(percentage = n/z2*100)
  z4 <- dat %>% summarise(chisq.test(!!quo_a,!!quo_b)$p.value)
  z5 <- as.numeric(z4)
  z6 <- z3 %>% mutate(chisq_pvalue = z5) 
  return(z6)
}

### I can get the function to run independantly on each covariate
univariate_table(covariate1,outcome,df)

### Using the code below, I cannot get a purrr / loop / map function to run through a list of the covariates without recieving this error:
#Error in summarise_impl(.data, dots) : 
#  Evaluation error: 'x' and 'y' must have the same length. 
covariates_list <- list("covariate1","covariate2","covariate3")
map(covariates_list,univariate_table,outcome,df)

1 Ответ

0 голосов
/ 04 ноября 2018

Мы подавим предупреждения:

univariate_table <- function(a, b, dat) {

  quo_a <- enquo(a)
  quo_b <- enquo(b)

  z1 <- dat %>% count(!!quo_b, !!quo_a)
  z2 <- sum(z1$n)
  z3 <- z1 %>% mutate(percentage = n / z2 * 100)
  z4 <- dat %>% summarise(
    suppressWarnings(chisq.test(!!quo_a, !!quo_b))$p.value
  )
  z5 <- as.numeric(z4)
  z6 <- z3 %>% mutate(chisq_pvalue = z5)

  return(z6)

}

затем немного измените способ вызова функции:

covariates_list %>% 
  syms() %>% 
  map(function(cov) univariate_table(!!cov, outcome, df))
## [[1]]
## # A tibble: 4 x 5
##   outcome covariate1     n percentage chisq_pvalue
##   <chr>   <chr>      <int>      <dbl>        <dbl>
## 1 n       n              8        40.           1.
## 2 n       y              3        15.           1.
## 3 y       n              7        35.           1.
## 4 y       y              2        10.           1.
## 
## [[2]]
## # A tibble: 4 x 5
##   outcome covariate2     n percentage chisq_pvalue
##   <chr>   <chr>      <int>      <dbl>        <dbl>
## 1 n       n              6        30.           1.
## 2 n       y              5        25.           1.
## 3 y       n              5        25.           1.
## 4 y       y              4        20.           1.
## 
## [[3]]
## # A tibble: 3 x 5
##   outcome covariate3     n percentage chisq_pvalue
##   <chr>   <chr>      <int>      <dbl>        <dbl>
## 1 n       n             11       55.0       0.0195
## 2 y       n              4       20.0       0.0195
## 3 y       y              5       25.0       0.0195
...