Оптимизируйте построение категориальных переменных с помощью ggplot2 facet_grid - выведите пропорцию только одного из двух значений для дихотомических переменных - PullRequest
0 голосов
/ 13 января 2020

У меня большой набор данных с более 150 категориальными и непрерывными переменными. Каждое наблюдение (строка) принадлежит либо к группе А, либо к группе В. Например:

set.seed(16)
mydf <- data.frame(ID = 1:500, group = sample(c("A", "B", "B", "B"), 500, replace = TRUE), 
length = rnorm(n = 500, mean = 0, sd = 1), 
weight = runif(500, min=0, max=1), 
color = sample(c("red", "orange", "yellow", "green", "blue"), 500,  replace = TRUE), 
size = sample(c("big", "small"), 500, replace = TRUE), 
age = sample(c("old", "young"), 500, replace = T))

Я работаю над оптимизацией схемы графиков, чтобы визуализировать взаимосвязь между групповыми и пропорциональными счетами для категориальных переменных. Пока что с некоторой помощью из предыдущего поста ({ ссылка }) у меня есть графики, использующие сетку граней ggplot2, но я столкнулся с двумя проблемами.

Проблема A: Столбчатые диаграммы расположены в алфавитном порядке по значениям (например, большой, старый, маленький, молодой), а не сгруппированы по категории (возраст: молодой рядом со старым; размер: большой рядом с маленьким и др. c). Проблема B: Для категориальных переменных только с двумя возможными значениями я хотел бы только построить соотношение в группе A и группе B для одного из значений. Например, только нанесите на график пропорцию группы A против группы B, которые являются «старыми», поскольку график доли «молодых» не предоставил бы никакой новой информации. Другие категориальные переменные, такие как цвет с несколькими значениями, должны иметь гистограмму для каждой возможности.

Я решил проблему A, установив уровни факторов в нужном порядке построения с помощью «mutate (value = factor (value, levels = c)» («большой», «маленький», «молодой», « старые "," красные "," оранжевые "," желтые "," зеленые "," синие ")))" и теперь порядок заговора выглядит так, как указано, с возрастными группами рядом друг с другом, цветами рядом друг с другом, и т. д. c.

data_cat <- 
  mydf %>% select(-ID) %>%
  mutate_if(.predicate = is.factor, .funs = as.character) %>%
  mutate(group = factor(group)) %>%
  pivot_longer(cols = which(sapply(., is.character)), names_to = 'key', values_to =  'value')%>%
  count(group, key, value) %>%
  group_by(group, key) %>%
  mutate(percent =  n/ sum(n)) %>%
  mutate(value = factor(value, levels=c("big", "small", "young", "old", "red", "orange", "yellow", "green", "blue"))) %>%

ggplot(data_cat) +
  geom_col(aes(group, percent, fill = key)) +
  facet_grid(~ value)

Я все еще остаюсь с проблемой B, подавляя построение одного из двух результатов для дихотомических категориальных переменных. Я думаю, что мне нужно найти способ извлечь "уровни факторов" из каждой переменной, а затем работать с подмножеством, где это значение == 2, искал, но еще не нашел способ сделать это.

1 Ответ

0 голосов
/ 13 января 2020

Это решение, которое вы искали с проблемой B? Я добавил фильтр в конце ваших шагов управления данными, удалив значения, равные «молодому» и «маленькому», двум дихотомическим случаям. На графике теперь отображаются столбики для «больших», «старых» и 5 категорий для цвета.

set.seed(16)
mydf <- data.frame(ID = 1:500, group = sample(c("A", "B", "B", "B"), 500, replace = TRUE), 
                   length = rnorm(n = 500, mean = 0, sd = 1), 
                   weight = runif(500, min=0, max=1), 
                   color = sample(c("red", "orange", "yellow", "green", "blue"), 500,  replace = TRUE), 
                   size = sample(c("big", "small"), 500, replace = TRUE), 
                   age = sample(c("old", "young"), 500, replace = T))

key <- lapply(mydf, function(x){ifelse(length(levels(x))==2, 1, 0)})
dichotomous <- names(which(key == 1))[-1]

mydf %>% select(-ID) %>%
  mutate_if(.predicate = is.factor, .funs = as.character) %>%
  mutate_at(.vars = vars(dichotomous), .funs = function(x){ifelse(x == unique(x)[2], NA, x)}) %>%
  mutate(group = factor(group)) %>%
  pivot_longer(cols = which(sapply(., is.character)), names_to = 'key', values_to =  'value')%>%
  count(group, key, value) %>%
  group_by(group, key) %>%
  mutate(percent =  n/ sum(n)) %>%
  mutate(value = factor(value, levels=c("big", "small", "young", "old", "red", "orange", "yellow", "green", "blue"))) %>%
  na.omit() -> data_cat

ggplot(data_cat) +
  geom_col(aes(group, percent, fill = key)) +
  facet_grid(~ value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...