如何按年按月正确汇总CSV中prtotAdjust列的降雨量数据?
问题分析与解决方案
你的汇总结果异常,核心原因是数据读取时的列数不匹配,可能伴随header参数设置不当,导致数据错位,prtotAdjust列混入大量无关数值,最终总和失真。
具体问题点
- 列数不匹配:你的样本数据仅包含4列(An、Mois、Jour、prtotAdjust),但代码中指定了5列的
col.names(包含tasAdjust),这会导致读取时将下一行的第一个字段填充到tasAdjust列,数据完全错位,prtotAdjust列被错误赋值。 - header参数错误:如果
skip=48后的第一行是数据而非表头,设置header=TRUE会将该行数据识别为列名,进一步加剧数据错位。
修正后的代码
基础版(使用aggregate)
# 读取数据:匹配实际列数,确认header参数 data <- read.csv2('./data.csv', header = FALSE, # 若skip后第一行是数据则设为FALSE;如果是表头则设为TRUE sep = ";", dec = ".", skip = 48, col.names = c("An", "Mois", "Jour", "prtotAdjust"), colClasses = c("factor", "factor", "factor", "numeric")) # 按年份+月份汇总降雨量 aggregate(prtotAdjust ~ An + Mois, data, sum, na.rm = TRUE)
简洁版(使用dplyr)
如果习惯tidyverse风格,用dplyr更直观:
library(dplyr) data <- read.csv2('./data.csv', header = FALSE, sep = ";", dec = ".", skip = 48, col.names = c("An", "Mois", "Jour", "prtotAdjust"), colClasses = c("factor", "factor", "factor", "numeric")) # 分组汇总 monthly_total <- data %>% group_by(An, Mois) %>% summarise(total_rainfall = sum(prtotAdjust, na.rm = TRUE), .groups = "drop") print(monthly_total)
验证步骤
在汇总前,务必先检查读取的数据是否正确:
head(data)
确认prtotAdjust列的数值与你提供的样本数据一致,再执行汇总操作。
内容的提问来源于stack exchange,提问作者GisUser
相关产品推荐
相关产品推荐

