如何将R语言中两个宽格式DataFrame重塑为长格式以用于ggplot绘图?
如何将两个宽格式DataFrame重塑为适配ggplot的长格式?
原始数据
你提供的两个宽格式DataFrame构建代码如下:
# df1(包含B系列数据) Name <- c("ST01","ST02","ST03") B1 <- c(0.01,0.003,0.04) B2 <- c(0.02,0.002,0.02) B3 <- c(0.04,0.008,0.06) B4 <- c(0.08,0.009,0.08) B5 <- c(0.09,0.004,0.05) df1 <- data.frame(Name,B1,B2,B3,B4,B5) # df2(包含A系列数据) Name <- c("ST01","ST02","ST03") A1 <- c(0.02,0.036,0.14) A2 <- c(0.04,0.034,0.32) A3 <- c(0.05,0.054,0.56) A4 <- c(0.06,0.034,0.78) A5 <- c(0.08,0.24,0.59) df2 <- data.frame(Name,A1,A2,A3,A4,A5)
解决方案:重塑为长格式并合并
使用tidyverse工具包(包含dplyr和tidyr)可以高效完成数据重塑,这也是适配ggplot2的标准方式:
# 加载工具包 library(tidyverse) # 将df1转为长格式(提取B系列的数值和对应编号) df1_long <- df1 %>% pivot_longer( cols = starts_with("B"), # 选择所有以B开头的列 names_to = "Value", # 列名转为Value列 values_to = "B" # 列值转为B列 ) %>% mutate(Value = str_remove(Value, "B") %>% as.integer()) # 去掉B前缀,转成整数编号 # 将df2转为长格式(提取A系列的数值和对应编号) df2_long <- df2 %>% pivot_longer( cols = starts_with("A"), names_to = "Value", values_to = "A" ) %>% mutate(Value = str_remove(Value, "A") %>% as.integer()) # 按Name和Value合并两个长格式数据框 merged_df <- inner_join(df1_long, df2_long, by = c("Name", "Value")) # 查看最终结果 print(merged_df)
运行后会得到你期望的格式:
Name Value A B 1 ST01 1 0.020 0.010 2 ST01 2 0.040 0.020 3 ST01 3 0.050 0.040 4 ST01 4 0.060 0.080 5 ST01 5 0.080 0.090 6 ST02 1 0.036 0.003 7 ST02 2 0.034 0.002 8 ST02 3 0.054 0.008 9 ST02 4 0.034 0.009 10 ST02 5 0.240 0.004 11 ST03 1 0.140 0.040 12 ST03 2 0.320 0.020 13 ST03 3 0.560 0.060 14 ST03 4 0.780 0.080 15 ST03 5 0.590 0.050
适配ggplot的绘图示例
1. 所有A与B的整体关系散点图
ggplot(merged_df, aes(x = A, y = B)) + geom_point(size = 2) + labs(title = "A与B的整体关系", x = "A值", y = "B值") + theme_minimal()
2. 按Value分组的A与B关系图(分面展示)
ggplot(merged_df, aes(x = A, y = B)) + geom_point(size = 2) + labs(title = "按Value分组的A与B关系", x = "A值", y = "B值") + theme_minimal() + facet_wrap(~Value) # 每个Value单独成图
这种长格式是ggplot2最适配的整洁数据格式:每个变量占一列,每个观测占一行,完全满足你的绘图需求。
内容的提问来源于stack exchange,提问作者Peter.2055
相关产品推荐
相关产品推荐

