【问题标题】:split data frame and create stacked percent barplot in R拆分数据框并在 R 中创建堆叠百分比条形图
【发布时间】:2015-03-24 07:48:56
【问题描述】:

我的数据框如下所示:

plant  distance
one      1
one      3
one      2
one      3
one      7
one      4
one      6
one      8
one      9
two      1
two      6
two      4
two      8
two      5
two      3
three ……

我想将每个级别的distance 按间隔(例如,interval=3)分组。

plant  distance group
  one      1    1
  one      3    1
  one      2    1
  one      3    1
  one      7    3
  one      4    2
  one      6    2
  one      8    3
  one      9    3
  two      1    1
  two      6    2
  two      4    2
  two      8    3
  two      5    2
  two      3    1
  three ……

并计算每组的百分比

plant group percentage
one     1     0.44
one     2     0.22
one     3     0.33
two     1     0.33
two     2     0.50
two     3     0.17
three ……

最后,绘制每个组的每个级别的百分比,如下所示:

而且我不知道如何按间隔拆分每个级别。对不起我的英语不好!感谢您的帮助!

【问题讨论】:

  • 你到底想要什么?你试过什么?例如,您可以使用split(my_data$distance, my_data$plant) 拆分数据框,也可以使用cut(my_data$distance, breaks = seq(min(my_data$distance), max(my_data$distance), 3)) 等进行分组。
  • @lukeA 感谢您的回复,我已经尝试了很多次,我已经更新了帖子。

标签: r ggplot2


【解决方案1】:

这是使用dplyr 的一种方法:

library(dplyr)
library(ggplot2)
my_data %>%
  mutate(group = factor(cut(distance, seq(0, max(distance), 3), F))) %>%
  group_by(plant, group) %>%
  summarise(percentage = n()) %>%
  mutate(percentage = percentage / sum(percentage)) %>%
  ggplot(aes(x = plant, y = percentage, fill = group)) + 
  geom_bar(stat = "identity", position = "stack")

【讨论】:

  • 感谢您的解决方案,效率很高。我收到一个错误:ggplot2 doesn't know how to deal with data of class uneval。你能多谈谈'%>%'、'group_by'和'mutate'吗?
  • mutatemy_data$group <- factor(cut(my_date$distance, seq(0, max(my_data$distance), 3), F)))group_bysummarise 的数据集进行分组。 %>% 将 my_data 从一个操作传递到另一个操作,如果你想这样说的话。你会通过 google'ing 找到很多信息。我正在使用 dplyr_0.4.0 和 ggplot2_1.0.0 - 此处的代码适用于您的示例数据。
  • 我们已经使用符号%>%进行连锁操作,如何断链保存剧情?
  • 如果要分别保存生成的数据框和绘图:dat <- my_data %>% mutate(group = factor(cut(distance, seq(0, max(distance), 3), F))) %>% group_by(plant, group) %>% summarise(percentage = n()) %>% mutate(percentage = percentage / sum(percentage)); p <- ggplot(dat, aes(x = plant, y = percentage, fill = group)) + geom_bar(stat = "identity", position = "stack"); p
  • 我发现一个小问题,当我使用你的解决方案对数据进行分组时,最后一组是NA。比如我们把1到10的数组用interval=3分成四组,分别是group 1(1 2 3)group 2(4 5 6)group 3(7 8 9)group 4(10),但是group 4NA,因为@的长度987654340@ 小于interval=3,所以我的问题是如何解决?非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 2018-12-09
  • 2022-01-18
  • 2017-03-18
  • 2020-04-18
相关资源
最近更新 更多