Использование purrr :: walk () и ifelse для создания ggplots - PullRequest
1 голос
/ 27 мая 2019

У меня есть датафрейм с одной строкой на человека. Столбцы - это переменная результата, а затем группа потенциальных предикторов этого результата. В качестве предварительного шага моего анализа данных я хочу визуализировать каждую переменную предиктора и ее связь с результатом, используя ggplot. Мне нужна гистограмма для непрерывных переменных и гистограмма для категориальных.

Моя попытка

numeric <- c(0,1.1,2.4,3.1,4.0,5.9,4.2,3.3,2.2,1.1)
categorical <- as.factor(c("yes","no","no","yes","yes","no","no","yes","no","no"))
outcome <- as.factor(c("alive","dead","alive","dead","alive","dead","alive","dead","alive","dead"))
df <- data.frame(num = numeric, cat = categorical, outcome = outcome)
predictors <- c("num", "cat")
predictors %>%
    walk(print(ggplot(df, aes(x=., fill=outcome)) +
    {ifelse(class(.) == "factor", geom_bar(position="fill"), geom_histogram(position="fill", bins=10))}))

Но я получаю ошибку

Error in rep(no, length.out = length(ans)): attempt to replicate an object of type 'environment'
Traceback:

1. predictors %>% walk(print(ggplot(df, aes(x = ., fill = outcome)) + 
 .     {
 .         ifelse(class(.) == "factor", geom_bar(position = "fill"), 
 .             geom_histogram(position = "fill", bins = 10))
 .     }))
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
3. eval(quote(`_fseq`(`_lhs`)), env, env)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
5. `_fseq`(`_lhs`)
6. freduce(value, `_function_list`)
7. withVisible(function_list[[k]](value))
8. function_list[[k]](value)
9. walk(., print(ggplot(df, aes(x = ., fill = outcome)) + {
 .     ifelse(class(.) == "factor", geom_bar(position = "fill"), 
 .         geom_histogram(position = "fill", bins = 10))
 . }))
10. map(.x, .f, ...)
11. as_mapper(.f, ...)
12. print(ggplot(df, aes(x = ., fill = outcome)) + {
  .     ifelse(class(.) == "factor", geom_bar(position = "fill"), 
  .         geom_histogram(position = "fill", bins = 10))
  . })
13. ifelse(class(.) == "factor", geom_bar(position = "fill"), geom_histogram(position = "fill", 
  .     bins = 10))   # at line 9 of file <text>

Я ожидаю, что этот код два производит два графика numeric plot categorical plot

В моем фактическом наборе данных> 20 предикторов, поэтому я хотел бы получить хороший способ создать более 20 ggplots и в идеале сохранить его в таком конвейерном формате, чтобы я мог добавить дополнительные шаги после того, как я получу графики.

1 Ответ

2 голосов
/ 27 мая 2019

Это один из способов передачи predictors столбцов в map и создание списка графиков на основе class столбца.

library(tidyverse)
library(rlang)

p1 <- map(predictors, function(p) if (class(df[[p]]) == "factor") 
      ggplot(df, aes(x = !!sym(p), fill=outcome)) + geom_bar(position="fill")
      else
      ggplot(df, aes(x = !!sym(p), fill=outcome)) + 
                 geom_histogram(position="fill", bins=10))

p1[[1]]

enter image description here

p1[[2]]

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...