Я пытаюсь использовать 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)