使用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
看起来完全像我想要的:
但是,用我的实际数据,相同的代码会产生这种混乱:
我确实找到了解决方案:当我添加这一行并使用新的mydata.unique
作为ggplot的基础时,它的工作原理与示例数据完全相同。由于某些原因,示例数据中不需要这样做,而在我的实际数据中,管道中的unique()
似乎什么也没做。
mydata.unique <- unique(mydata2[c("quality","category", "count_q", "tot_q", "pc")])
我不明白为什么我需要添加以上行。显然我不能分享我的实际数据。也许有人仍然了解这是怎么回事。也许与unique()
无法处理的数据中的其他(无关)列有关?
尝试使用distinct()
而不是unique()
。在这种情况下,您可能需要总结而不是mutate() + distinct()
如果您的原始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
。