对多个数据框进行子集化并聚合它们以有效地进行绘图

Posted

技术标签:

【中文标题】对多个数据框进行子集化并聚合它们以有效地进行绘图【英文标题】:Subsetting multiple dataframes and aggregating them for plotting in an efficient manner 【发布时间】:2021-09-26 23:23:05 【问题描述】:

我想按列对两个数据框进行子集化,同时保留第一列(包含名称),然后我想为原始数据框的每个子集生成一个图。诀窍是他们每个月都有一列,然后我聚合这些列以获得条形图。

我用随机数据生成了一个示例来说明我的问题:

df1 <- data.frame(name = c("name1","name2","name3","name4"),
                 month1 = c(5,6,7,8),
                 month2 = c(10,11,12,13),
                 month3 = c(15,16,17,18))

df2 <- data.frame(name = c("name1","name2","name3","name4"),
                 month1 = c(22,23,24,25),
                 month2 = c(31,34,35,39),
                 month3 = c(42,43,45,46))
A data.frame: 4 × 4
name    month1  month2  month3
<chr>   <dbl>   <dbl>   <dbl>
name1   5   10  15
name2   6   11  16
name3   7   12  17
name4   8   13  18


A data.frame: 4 × 4
name    month1  month2  month3
<chr>   <dbl>   <dbl>   <dbl>
name1   22  31  42
name2   23  34  43
name3   24  35  45
name4   25  39  46

所以基本上,在这里我想要三个子框架,每个月列一个,同时保留名称列。这就是我手动实现的方式:

month1description1 <- df1 %>%
  select("name","month1") %>%
  rename("description 1" = "month1")

month1description2 <- df2 %>%
  select("name","month1") %>%
  rename("description 2" = "month1")


month1plot <- left_join(month1description1, month1description2, by = c("name"))
rm(month1description1,month1description2)

month1plot <- melt(month1plot, id = "name") 



name    variable    value
<chr>   <fct>   <dbl>
name1   description 1   5
name2   description 1   6
name3   description 1   7
name4   description 1   8
name1   description 2   22
name2   description 2   23
name3   description 2   24
name4   description 2   25

##Plot
month1 <- month1plot %>%
  ggplot(aes(x = name, y = value, fill = variable)) +
  geom_bar(stat = "identity", position = position_stack()) +
  labs(title = "Plot Title",
       subtitle = "month 1",
       x="",
       y="Count") +
  scale_fill_viridis_d(name = "", option = "inferno", begin = 0.3, end = 0.7, direction = -1) +
  scale_shape_tableau() +
  theme_economist() +
  theme(plot.background = element_rect(fill = "white"), 
        plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        plot.margin = unit(c(1,1,1,1), "cm"))
month1

然后我绘制这个数据框,ggplot 中的颜色/填充元素是通过表征每个原始帧的内容(描述 1 和描述 2)添加的变量。

一般来说,这并不代表过多的代码,我很乐意保持原样,但是当面对 12 个月以上的列形式并且需要 12 多个单独的图时,代码似乎有点笨重。

有没有办法以比拆分、聚合和融合每个数据帧更有效的方式至少生成每个子数据帧?

【问题讨论】:

【参考方案1】:

不需要melt。将您的 dfs 放入列表中,使用 dplyr::bind_rowsrename/select 您的变量:

library(dplyr)
library(ggplot2)
library(ggthemes)

month1plot <-list("description 1" = df1, "description 2" = df2) %>% 
  dplyr::bind_rows(.id = "variable") %>% 
  dplyr::select(name, variable, value = month1)

month1plot %>%
  ggplot(aes(x = name, y = value, fill = variable)) +
  geom_bar(stat = "identity", position = position_stack()) +
  labs(title = "Plot Title",
       subtitle = "month 1",
       x="",
       y="Count") +
  scale_fill_viridis_d(name = "", option = "inferno", begin = 0.3, end = 0.7, direction = -1) +
  scale_shape_tableau() +
  theme_economist() +
  theme(plot.background = element_rect(fill = "white"), 
        plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        plot.margin = unit(c(1,1,1,1), "cm"))

【讨论】:

谢谢!这以一种非常简洁的方式完成了这项工作,我可以在我的代码的其他部分使用你的答案。最有帮助!

以上是关于对多个数据框进行子集化并聚合它们以有效地进行绘图的主要内容,如果未能解决你的问题,请参考以下文章

R:根据一天中的时间有效地对数据框进行子集化

使用列表对数据框进行子集以定义输入列

如何使用“OR”组合多个条件以对数据框进行子集化?

重构pyspark数据框

如何对聚合进行过滤以有效地使用索引?

R子集嵌套列表,选择多个条目