Ggplot2: unique () не работает должным образом с dplyr piping - PullRequest
0 голосов
/ 26 мая 2020

У меня проблемы с функцией unique () при подключении к dplyr. С моим простым примером кода это работает нормально:


category <- as.factor(c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4))
quality <- as.factor(c(0, 1, 2, 3, 3, 0, 0, 1, 3, 2, 2, 2, 1, 0, 3, 2, 3, 3, 1, 0, 2, 1))
mydata <- data.frame(category, quality)

Это настраивает мой фрейм данных, чтобы с ним было легче работать и создавать красивый график:

mydata2 <- mydata %>% 
  group_by(category, quality) %>% 
  mutate(count_q = n()) %>% 
  ungroup() %>%
  group_by(category) %>% 
  mutate(tot_q = n(),pc = count_q*100 / tot_q) %>% 
  unique() %>% 
  arrange(category)

myplot <- ggplot(mydata2, aes(x = category, y = pc, fill = quality)) +
  geom_col() +
  geom_text(aes(
    x = category,
    y = pc,
    label = round(pc,digits = 1),
    group = quality),
    position = position_stack(vjust = .5)) +
  ggtitle("test") +
  xlab("cat") +
  ylab("%") +
  labs("quality")

myplot

Выглядит именно так, как я хочу :

enter image description here

Однако с моими фактическими данными тот же код создает такой беспорядок:

enter image description here

Я нашел решение: когда я добавляю эту строку и использую новую mydata.unique в качестве основы для моего ggplot, она работает точно так же, как с данными из моего примера. По какой-то причине это не требуется в данных примера, тогда как в моих фактических данных unique() внутри трубопровода, похоже, ничего не делает.

mydata.unique <- unique(mydata2[c("quality","category", "count_q", "tot_q", "pc")])

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

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Попробуйте использовать distinct() вместо unique(). И в этом случае, вероятно, вам нужно подвести итоги вместо mutate() + distinct()

1 голос
/ 26 мая 2020

Если ваш исходный df имеет больше переменных, попробуйте следующее:

mydata2 <- mydata %>% 
  group_by(category, quality) %>% 
  mutate(count_q = n()) %>% 
  ungroup() %>%
  group_by(category) %>% 
  mutate(tot_q = n(),pc = count_q*100 / tot_q) %>% 
  distinct(category, quality, count_q, tot_q, pc, .keep_all = TRUE) %>% 
  arrange(category)

Или, может быть, как указано @adalvarez, замените mutate на summarise.

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