R语言双循环实现:按年份计算均值并填充矩阵列
解决R语言中按年份循环填充矩阵均值的问题
方法一:单循环实现行号与年份的对应
你不需要用双重循环,因为年份序列2003:2018和矩阵行号1:16是一一对应的关系,用单循环就能完成匹配赋值:
# 初始化结果矩阵 matplot2 <- as.data.frame(matrix(NA, nrow = 16, ncol = 4)) # 定义目标年份序列 target_years <- 2003:2018 # 循环遍历每个年份对应的行号 for (row_idx in seq_along(target_years)) { current_year <- target_years[row_idx] # 计算对应年份的TotalTime均值,加入na.rm避免NA干扰 matplot2[row_idx, 1] <- mean(matplot[matplot$Year == current_year, "TotalTime"], na.rm = TRUE) }
方法二:更高效的非循环写法(推荐)
在R中,尽量避免显式循环,用内置函数或tidyverse工具可以更简洁高效地完成任务:
用tapply实现
# 按年份分组计算均值 yearly_means <- tapply(matplot$TotalTime, matplot$Year, mean, na.rm = TRUE) # 将结果按目标年份顺序填充到矩阵第一列 matplot2[, 1] <- yearly_means[as.character(target_years)]
用dplyr实现(更易读)
library(dplyr) # 分组计算并排序后提取均值 yearly_means <- matplot %>% filter(Year %in% target_years) %>% group_by(Year) %>% summarize(mean_total_time = mean(TotalTime, na.rm = TRUE)) %>% arrange(Year) # 填充到矩阵 matplot2[, 1] <- yearly_means$mean_total_time
说明
- 加入
na.rm = TRUE是为了处理数据中可能存在的缺失值,避免均值计算结果为NA; - 单循环已经能满足你的需求,双重循环在这里是冗余的,因为行号和年份是严格对应的一一映射关系。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

