2016-12-02 4 views
0

Ich habe eine Reihe von Tageswerten der gerasterten Meeresoberflächentemperatur seit 34 Jahren (12418 Tagesakten x 4248 Punkte) und vortäuschen, wöchentliche Werte zu berechnen. Es ist mir fast gelungen, diesem Beitrag zu folgen https://stackoverflow.com/a/15102394/709777. Aber es gibt einige Unstimmigkeiten zwischen Daten und Wochen. Ich kann den Punkt nicht finden und ich möchte sicher sein, dass ich die richtigen Daten bekomme, um den Wochendurchschnitt zu berechnen.R wöchentlich im Durchschnitt

Ich benutze dieses Stück meiner R Skript täglich um Daten zu lesen und einen großen Datenrahmen zu bauen, die alle Tageswerte von einem einzigen Punkt enthält in einer Spalte (12418 Zeilen/Tag von 4248 Spalten/Temperatur)

# 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") 

So lese ich meine Daten und Daten. Um ein kurzes Beispiel zu behalten, habe ich eine Teilmenge des Datenrahmens in dieser Datei temp-sst.csv (1000 Obs. Von 10 Variablen, einschließlich "Day", "Week", "Year", "Week_Day", "End_of_Week") gespeichert.

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 
} 

Aber hier kommt das Problem. "b" Datenrahmen von der Schleife hat 145 Zeilen, während SST.mat und fechas.semana nur 144 haben. Ich habe den Punkt nicht gefunden, wo diese Meinungsverschiedenheit kommt.

Jede Hilfe würde sehr geschätzt werden, ich bin hier fest. Dank

+6

"_To eine kurze example_ halten" - statt einen Link zu einer auf Dropbox 1000 * 10-Datei veröffentlichen, sollten Sie eine _minimal_, in sich geschlossene sorgen Beispiel. – Henrik

+0

Sie haben Recht @henrik, hilfreiche Flagge ausgelöst – pacomet

Antwort

1

Sie haben ein Duplikat in einem Tal von b$End_of_Week.

Zuerst bemerkte ich, dass es keinen Unterschied in der Menge Mitgliedschaft war:

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

Charakter (0)

Dann wurde mir klar, dass wegen eines doppelten sein musste und es bestätigt wie folgt aus:

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

Blick auf die Tabelle zeigt die Dupe ist 1983-01-01.

Es scheint die Ursache ist, dass Sie durch End_of_Week + Year aggregieren wo Year unnötig ist, da End_of_Week das Jahr in es als gut, und wenn Sie nur Aggregat von End_of_Week Sie 144 statt 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) 
erhalten
Verwandte Themen