Ggplot2:unique()在dplyr管道中无法正常工作

问题描述 投票:0回答:2

使用dplyr进行管道传递时,unique()函数存在一些问题。用我的简单示例代码,可以正常工作:


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()无法处理的数据中的其他(无关)列有关?

r ggplot2 dplyr
2个回答
1
投票

尝试使用distinct()而不是unique()。在这种情况下,您可能需要总结而不是mutate() + distinct()


0
投票

如果您的原始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

© www.soinside.com 2019 - 2024. All rights reserved.