2017-05-30 2 views
1

Ich habe folgende R-Matrix:Erweiterung R Matrix auf Datum

Date MyVal 
2016 1 
2017 2 
2018 3 
.... 
2026 10 

Was ich tun möchte, ist „es sprengen“, so dass es so geht (wo Monatswerte linear interpoliert werden):

Date  MyVal 
01/01/2016 1 
02/01/2016 .. 
.... 
01/01/2017 2 
.... 
01/01/2026 10 

ich weiß, ich leicht die Sequenz unter Verwendung erzeugen kann:

DateVec <- seq(as.Date(paste(minYear,"/01/01", sep = "")), as.Date(paste(maxYear, "/01/01", sep = "")), by = "month") 

Und ich kann, dass eine große Matrix zu machen verwenden und dann fülle die Dinge mit einer for-Schleife über dem DateVector ein, aber ich frage mich, ob es einen eleganteren Weg gibt, dies zu tun?

+0

hat einen Blick auf 'merge' – HubertL

+0

Wenn Sie ein [reproduzierbares Beispiel] liefern (https? : //stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) Ich kann die Lösung darauf überprüfen. – Masoud

+0

Überprüfen Sie die folgende Lösung. In der Zwischenzeit benötigt es einige Änderungen (nicht zur letzten Zeile, sondern zum Datenrahmen-Vorbereitungsteil), basierend auf der genauen Struktur Ihres Datensatzes. – Masoud

Antwort

1

können Sie stats::approx benutzen müssen Monat und Tag und seine auch in asPOSIXct oder as.Date Format

library(stats) 

ipc <- approx(df$Date, df$MyVal, xout = DateVec, 
rule = 1, method = "linear", ties = mean) 

Sie wahrscheinlich müssen zuerst die Daten in Ihrem ursprünglichen Datenrahmen umwandeln.

Nach dem, was Sie zur Verfügung gestellt, das funktioniert:

#reproducing the data-frame: 
Date <- seq(2016,2026) 
MyVal <- seq(1:11) 
Date <- data.frame(as.Date(paste0(Date,"/01/01"))) #yyyy-mm-dd format 
df <- cbind(Date, MyVal) 
df <- as.data.frame(df) 
colnames(df) <- c ("Date", "MyVal") #Changing Column Names 

#Make the reference data-frame for interpolation: 
minY <- min(df$Date, na.rm=T) 
maxY <- max(df$Date, na.rm=T) 
DateVec <- seq(minY, maxY, by = "month") 

#Interpolation: 
intrpltd_df <- approx(df$Date, df$MyVal, xout = DateVec, 
      rule = 1, method = "linear", ties = mean) 

Dies ist der Ausgang:

> head(data.frame(intrpltd_df)) 

#   x  y 
# 1 2016-01-01 1.000000 
# 2 2016-02-01 1.084699 
# 3 2016-03-01 1.163934 
# 4 2016-04-01 1.248634 
# 5 2016-05-01 1.330601 
# 6 2016-06-01 1.415301