对多个数据框进行子集化并聚合它们以有效地进行绘图
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_rows
、rename/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"))
【讨论】:
谢谢!这以一种非常简洁的方式完成了这项工作,我可以在我的代码的其他部分使用你的答案。最有帮助!以上是关于对多个数据框进行子集化并聚合它们以有效地进行绘图的主要内容,如果未能解决你的问题,请参考以下文章