如何将宽格式数据转换为长格式以绘制折线图?
宽格式转长格式并绘制折线图
以下是用R语言处理宽转长并绘制折线图的完整流程,适配你的数据(含缺失值):
1. 加载工具包
首先加载tidyverse,它包含了数据转换和绘图所需的核心函数:
library(tidyverse)
2. 导入数据
先将你提供的数据转换成R可识别的数据框(如果数据来自外部文件,用read.csv()或read.table()读取即可):
df <- data.frame( Participant = c("P03", "P04", "P05", "P07"), Day.1 = c(2330, 2330, 4580, 2340), Day.2 = c(2290, 2300, 2200, 2300), Day.3 = c(2340, 2340, 2210, 2340), Day.4 = c(3820, 2340, 2210, 2220), Day.5 = c(3740, 2340, 2230, 2300), Day.6 = c(2260, 2340, 2260, 2340), Day.7 = c(2340, NA, 2210, 2250), Day.8 = c(2300, NA, 2340, 2340), Day.9 = c(2270, NA, 2260, 2340), Day.10 = c(2300, NA, 2340, 2340), Day.11 = c(2340, NA, 2150, 2340), Day.12 = c(2340, NA, 2010, 2340), Day.13 = c(2220, NA, 2260, 2340), Day.14 = c(2260, NA, 2280, 2340), Day.15 = c(2340, NA, 2230, 2340), Day.16 = c(2340, NA, 2330, 2340), Day.17 = c(NA, NA, 320, 2340), Day.18 = c(NA, NA, 2180, 2340), Day.19 = c(NA, NA, 2340, 2300), Day.20 = c(NA, NA, 2340, 2340), Day.21 = c(NA, NA, 2220, 2340), Day.22 = c(NA, NA, NA, 2340), Day.23 = c(NA, NA, NA, 2300), Day.24 = c(NA, NA, NA, 2300), Day.25 = c(NA, NA, NA, 2340), Day.26 = c(NA, NA, NA, 2340), Day.27 = c(NA, NA, NA, 2300), Day.28 = c(NA, NA, NA, 2340) )
3. 宽格式转长格式
用pivot_longer()完成格式转换,同时提取Day.X中的数字作为数值型的days列:
long_df <- df %>% pivot_longer( cols = starts_with("Day."), # 选中所有Day.开头的列 names_to = "days", # 原列名存入days列 values_to = "score", # 原列值存入score列 values_drop_na = FALSE # 保留缺失值(默认也是FALSE,可省略) ) %>% mutate(days = parse_number(days)) # 提取天数数字并转为数值型
转换后每行对应一个参与者某一天的得分,缺失值NA会被保留,后续绘图时会自动跳过这些点。
4. 绘制折线图
用ggplot2绘制,每个参与者用不同颜色区分:
ggplot(long_df, aes(x = days, y = score, color = Participant)) + geom_line(linewidth = 1) + labs( x = "天数", y = "得分", title = "各参与者每日得分变化", color = "参与者" ) + theme_minimal()
关键说明
- 缺失值处理:
geom_line()默认会忽略NA,不会在缺失处绘制折线,如果你想让折线在缺失位置断开,保持默认即可;若需要填充缺失值,可以用dplyr::fill()或tidyr::replace_na()处理。 - 若使用Python,逻辑类似:用
pd.melt()转长格式,再用matplotlib/seaborn绘图。
内容的提问来源于stack exchange,提问作者JacobHad
相关产品推荐
相关产品推荐

