R语言新手求助:计算列均值生成数据框并绘制折线图
嗨~作为R语言新手,这个需求其实很好实现,我分步骤给你拆解清楚,保证你能跟着做出来:
步骤1:确认数据结构并加载必要的包
首先假设你的源数据框名为df,咱们先确保加载常用的数据处理和绘图包(如果你还没安装的话,先跑install.packages(c("dplyr", "tidyr", "ggplot2"))完成安装):
# 加载需要的包 library(dplyr) library(tidyr) library(ggplot2)
步骤2:计算各hour列的整体平均值并转换格式
你的需求是对hour0到hour24这些列,计算所有行的平均值,然后整理成适合画折线图的结构(一列是小时数0-24,一列是对应平均值):
# 先筛选出除Date、ID外的列,计算每列的平均值 avg_hours <- df %>% select(-Date, -ID) %>% # 排除不需要的Date和ID列 summarise(across(everything(), mean, na.rm = TRUE)) # 对所有剩余列计算均值,na.rm用来忽略缺失值 # 把宽格式数据转成长格式(折线图需要这种一行对应一个数据点的结构) long_avg <- avg_hours %>% pivot_longer( cols = everything(), # 所有列都要参与格式转换 names_to = "hour", # 原列名(比如hour0)存到hour列 values_to = "average" # 原列的均值存到average列 ) %>% mutate(hour = as.numeric(sub("hour", "", hour))) # 把hour列的"hour"前缀去掉,转成纯数字
执行完上面的代码,long_avg就是你要的新数据框啦,结构大概是这样:
| hour | average |
|---|---|
| 0 | 30 |
| 1 | 40 |
| ... | ... |
| 24 | 300 |
如果不想加载第三方包,用基础R也能实现相同效果:
# 筛选出所有hour开头的列 hour_cols <- df[, !names(df) %in% c("Date", "ID")] # 计算每列的平均值 avg_values <- colMeans(hour_cols, na.rm = TRUE) # 构建最终的长格式数据框 long_avg_base <- data.frame( hour = as.numeric(sub("hour", "", names(avg_values))), average = as.vector(avg_values) )
步骤3:绘制折线图
用ggplot2画出来的图美观且容易调整样式:
ggplot(long_avg, aes(x = hour, y = average)) + geom_line(color = "#2196F3", linewidth = 1.2) + # 设置线条颜色和粗细 labs( x = "Hour", y = "Average Value", title = "Hourly Average Trend Over All Dates" ) + theme_minimal() # 选用简洁清爽的主题
要是想用基础R的原生绘图功能,也可以这样写:
plot( long_avg_base$hour, long_avg_base$average, type = "l", # 指定绘制折线图 col = "#2196F3", lwd = 1.2, xlab = "Hour", ylab = "Average Value", main = "Hourly Average Trend Over All Dates" )
这样就能得到你想要的折线图,X轴是0到24的连续小时数,Y轴是对应小时的整体平均值啦~
内容的提问来源于stack exchange,提问作者chen
相关产品推荐
相关产品推荐

