R语言宽格式频率表转长表适配ggplot分组柱状图的实现方法
你需要的是宽格式数据转长格式数据的操作,属于R数据清洗的常规需求,常用实现方案如下:
方案1:tidyverse生态推荐写法(最常用,可读性强)
用tidyr包的pivot_longer()函数实现,代码示例:
# 未安装包可先运行 install.packages("tidyverse") library(tidyr) freq_long <- pivot_longer( data = freq, cols = c(df1, df2), # 指定需要被转换为长格式的列 names_to = "source", # 原列名存入source列 values_to = "value" # 原数值存入value列 )
运行后得到的freq_long就是你需要的目标结构。
方案2:基础R实现(无需安装第三方包)
如果不想依赖外部包,可以用基础函数实现:
freq_long <- data.frame( variable = rep(freq$variable, each = 2), source = rep(c("df1", "df2"), times = nrow(freq)), value = as.vector(t(freq[, c("df1", "df2")])) )
方案3:data.table实现(适合大数量级场景,性能最优)
如果数据量很大,推荐用data.table的melt函数:
# 未安装包可先运行 install.packages("data.table") library(data.table) setDT(freq) # 转换为data.table格式 freq_long <- melt( freq, id.vars = "variable", measure.vars = c("df1", "df2"), variable.name = "source", value.name = "value" )
转换完成后,你可以直接用ggplot2绘制分组柱状图,示例代码如下:
library(ggplot2) ggplot(freq_long, aes(x = factor(variable), y = value, fill = source)) + geom_col(position = position_dodge(width = 0.9), width = 0.8) + labs(x = "变量取值", y = "计数") + theme_bw()
即可得到你预期的分组柱状图效果。
内容的提问来源于stack exchange,提问作者Mike de Groot
相关产品推荐
相关产品推荐

