2016-12-02 3 views
0

У меня есть набор ежедневных значений температуры поверхности поверхности с сеткой на решетке в течение 34 лет (12418 ежедневных файлов х 4248 точек) и притворяется, что вычисляет недельные значения. Я почти преуспел после этого сообщения https://stackoverflow.com/a/15102394/709777. Но есть некоторые разногласия между датами и неделями. Я не могу найти смысл, и я хочу быть уверенным, что получаю правильные даты для расчета среднего значения за неделю.R еженедельное усреднение

Я использую эту часть моего R сценария читать ежедневные данные и построить большой кадр данных, который содержит все ежедневные значения из одной точки в колонке (12418 строк/дни по 4248 колонку/температуры)

# Paths 
ruta_datos_diarios<-"/home/meteo/PROJECTES/VERSUS/DATA/SST/CSV/" 
ruta_files<-"/home/meteo/PROJECTES/VERSUS/SCRIPTS/CLUSTER/FILES/" 
ruta_eixida<-"/home/meteo/PROJECTES/VERSUS/OUTPUT/DATA/SEMANAL/" 

# List of daily files 
files <- list.files(path = ruta_datos_diarios, pattern = "SST-diaria-MED") 

output <- matrix(ncol=4248, nrow=length(files)) 
fechas <- matrix(ncol=1, nrow=length(files)) 

for (i in 1:length(files)){ 
    # read data 
    datos<-read.csv(paste0(ruta_datos_diarios,files[i],sep=""),header=TRUE,na.strings = "NA") 
    datos<-datos[complete.cases(datos),] 

    # Extract dates from daily file names 
    yyyy<-substr(files[i],16,19) 
    mm<-substr(files[i],20,21) 
    dd<-substr(files[i],22,23) 
    dates[i,]<-paste0(yyyy,"-",mm,"-",dd,sep="") 

    output[i,]<-t(datos$sst) 
} 

datos.df<-as.data.frame(output) 

# Build a dataframe with the dates (day, week and year) 
fechas<-as.data.frame(fechas) 
fechas$V1<-as.Date(fechas$V1) 
fechas$Week <- week(fechas$V1) 
fechas$Year <- year(fechas$V1) 

# Extract day of the week (Saturday = 6) 
fechas$Week_Day <- as.numeric(format(fechas$V1, format='%w')) 
# Adjust end-of-week date (first saturday from the original Date) 
fechas$End_of_Week <- fechas$V1 + (6 - fechas$Week_Day) 

# new dataframe from End_of_Week 
fechas.semana<-fechas[!duplicated(fechas$End_of_Week),] 
fechas.semana<-as.data.frame(fechas.semana) 

colnames(fechas)<-c("Day","Week","Year","Week_Day","End_of_Week") 
colnames(fechas.semana)<-c("Day","Week","Year","Week_Day","End_of_Week") 

Вот как я читаю свои данные и даты. Чтобы сохранить короткий пример, я сохранил подмножество фрейма данных в этом файле temp-sst.csv (1000 общ. Из 10 переменных, включая «День», «Неделя», «Год», «Неделя_Дай», «Конечная_очень»).

sst.dat <- read.csv("temp-dat.csv",header=TRUE) 

# Join dates and SST values 
sst.dat <- cbind(fechas, sst.dat) 

# Build new dates data frame 
fechas<-as.data.frame(sst.dat$Day) 
colnames(fechas)<-c("Day") 
fechas$Day<-as.Date(fechas$Day) 
fechas$Week <- week(fechas$Day) 
fechas$Year <- year(fechas$Day) 
# Extract day of the week (Saturday = 6) 
fechas$Week_Day <- as.numeric(format(fechas$Day, format='%w')) 
# Adjust end-of-week date (first saturday from the original Date) 
fechas$End_of_Week <- fechas$Day + (6 - fechas$Week_Day) 

fechas.semana<-fechas[!duplicated(fechas$End_of_Week),] 
fechas.semana<-as.data.frame(fechas.semana) 

colnames(fechas)<-c("Day","Week","Year","Week_Day","End_of_Week") 
colnames(fechas.semana)<-c("Day","Week","Year","Week_Day","End_of_Week") 

# Weekly aggregation function from the referred post 
media.semanal <- function(x, column){ 
    a<-aggregate(x[,column]~End_of_Week+Year, FUN=mean, data=x, na.rm=TRUE) 
    colnames(a)<-c("End_of_Week","Year","SSTmean") 
    return(a) 
} 

# Matrix to be populated by weekly function 
SST.mat<-matrix(nrow=nrow(fechas.semana), ncol=length(sst.dat)-5) # 5 son las columnas de fecha 

for (j in 6:length(sst.dat)){ # comienza en 6 para evitar las columnas de fecha 
b<-media.semanal(sst.dat,j) 
SST.mat[,j-5]<-b$SSTmean 
} 

Но здесь возникает проблема. «b» dataframe из цикла имеет 145 строк, тогда как SST.mat и fechas.semana имеют только 144. Я не нашел точку, в которой это несогласие приходит.

Любая помощь будет принята с благодарностью, я застрял здесь. Спасибо

+6

«_To держать короткий example_» - вместо того, чтобы разместить ссылку на файл 1000 * 10 на Dropbox, вы должны предоставить _minimal_, автономный пример. – Henrik

+0

Вы правы @henrik, полезный флаг поднят – pacomet

ответ

1

У вас есть дубликат в одной доле b$End_of_Week.

Сначала я заметил, что не было никакой разницы в составе набора:

setdiff(as.character(b$End_of_Week),as.character(fechas.semana$End_of_Week)) 

персонаж (0)

Тогда я понял, что должена было быть из-дубликат и подтвердил как это:

table(table(as.character(b$End_of_Week))>1) 
143 1 
FALSE TRUE 

Глядя на таблицу, изображен обман 1983-01-01.

Кажется, основной причиной является то, что вы агрегировать по End_of_Week + Year где Year является излишним, так как End_of_Week имеет год в нем, как хорошо, и если вы только агрегатный по End_of_Week вы получаете 144 вместо 145.

# Weekly aggregation function from the referred post 
media.semanal <- function(x, column){ 
    a<-aggregate(x[,column]~End_of_Week, FUN=mean, data=x, na.rm=TRUE) 
    colnames(a)<-c("End_of_Week","SSTmean") 
    return(a) 
} 

# Matrix to be populated by weekly function 
SST.mat<-matrix(nrow=nrow(fechas.semana), ncol=length(sst.dat)-5) # 5 son las columnas de fecha 

for (j in 6:length(sst.dat)){ # comienza en 6 para evitar las columnas de fecha 
    b<-media.semanal(sst.dat,j) 
    SST.mat[,j-5]<-b$SSTmean 
} 
dim(b) 
Смежные вопросы