2017-07-17 2 views
0

Ich arbeite mit mehreren CSV-Dateien in einem Ordner (2488) gespeichert. Jeder csv enthält monatliche Daten von Messstationen mit dem Format Jahre * Monate. Ich möchte alle diese CSV-Dateien in einem großen Datenrahmen speichern, in dem Spalten die IDs der verschiedenen Prüfstationen und die Zeilen die Zeiten% Y-% m-% d sind.Speichern Sie Daten nach Startdatum

Zu diesem Zweck habe ich mit list.files alle Dateien auflisten:

a <- list.files(pattern="./*.csv",full.names=TRUE) 

und erstellen Sie ein Dummy-Datenrahmen mit den endgültigen Abmessungen:

gst <- data.frame(NA,1860,2488) # 1860 times - 2488 stations 

Jede CSV-Datei beginnt in einem anderen Datum . Das früheste Datum gefunden ist Januar 1863, so habe ich den Datenrahmen mit 1860 Zeilen aus diesem Startdatum bis 2017. Juni

ich eine Reihe von Daten erstellen, um die Reihen von gst zu nennen:

s <- paste0(1863,"-01-01") 
    e <- paste0(2017,"-12-31") 
    ss<- chron(s, format='y-m-d') 
    ee<- chron(e, format='y-m-d') 
    dates <- seq.dates(ss,ee,by='months') 

In In der folgenden Schleife lese ich jede CSV-Datei. Zuerst ändere ich das ursprüngliche Datenrahmenformat: Jahre * Monate + Gesamtspalte.

# Initial format   
      Jan  Feb  Mar Apr 
    1993 NA  0.05 0.05 0.06 
    1994 0.18 0.15 0.1  0.19 
    1995 0.22 0.23 0.26 0.11 
    1996 0.14 0.11 0.1  0.08 
    1997 0.12 0.16 0.07 0.05 
    1998 0.12 0.07 0.12 0.18 
    1999 0.07 0.32 0.14 0.15 
    2000 0.13 0.22 0.15 0.1 
    2001 0.18 0.09 0.5  0.26 

zu einem einzigen Spalte Datenrahmen (kk.df) mit Daten gespeichert, wie:

Date  Value 
93-01-01 NA 
93-02-01 0.05 
93-03-01 0.05 
93-04-01 0.06 
93-05-01 0.05 
93-06-01 0.05 
93-07-01 0.03 
93-08-01 0.03 
93-09-01 0.05 
93-10-01 0.09 
93-11-01 0.04 
93-12-01 0.10 

Dies ist die Schleife ich arbeiten bin:

for (i in 1:length(a)){ 

    kk <- read.csv(a[i]) 
    colnames(kk) <- c(seq(1,12,1),'total') # 12 (months) columns and a total column 

    kk.ts <- ts(as.vector(t(as.matrix(kk))), 
       start=as.numeric(c(rownames(kk)[1],1)), end= as.numeric(c(rownames(kk)[dim(kk)[1]],12)),frequency=12) 

    kk.df <- as.data.frame(kk.ts) 
    colnames(kk.df) <- a[[i]] 

    a <- paste0(start,"-01-01") 
    b <- paste0(end,"-12-31") 
    ac<- chron(a, format='y-m-d') 
    bc<- chron(b, format='y-m-d') 
    times <- seq.dates(ac,bc, by="months") 

    rownames(kk.df) <- times 


    gst[i,] <- kk.df 
} 

Meine Frage ist, wie ich die gleiche Anzahl von Spalten wie Gaugin Stationen habe ich (2488 Stationen) und jede Station starten zu einem anderen Jahr-Monat, wie kann ich angeben, wenn jedes i für jede Station, die Zeile, in der es beginnen muss?

Wenn i = 1 und der erste Datensatz in 1993-01-01 ist, möchte ich, dass die Spalte in der Zeile gst beginnt, die 1993-01-01 entspricht und so weiter mit dem Rest der Stationen.

Vielen Dank.

Antwort

0

Vielleicht könnten Sie übernehmen eine Verknüpfung in Ihrer for-Schleife für das:

df = data.frame(date = seq(Sys.Date(),Sys.Date()+3,by=1)) 
station1 = data.frame(date = seq(Sys.Date()+2,Sys.Date()+3,by=1),data = c(1,2)) 
station2 = data.frame(date = seq(Sys.Date()+1,Sys.Date()+2,by=1),data = c(2,3)) 

df = df %>% left_join(station1) %>% rename(station1=data) 
df = df %>% left_join(station2) %>% rename(station2=data) 

Eingang:

> df 
     date 
1 2017-07-17 
2 2017-07-18 
3 2017-07-19 
4 2017-07-20 
> station1 
     date data 
1 2017-07-19 1 
2 2017-07-20 2 
> station2 
     date data 
1 2017-07-18 2 
2 2017-07-19 3 

Ausgang:

> df 
     date station1 station2 
1 2017-07-17  NA  NA 
2 2017-07-18  NA  2 
3 2017-07-19  1  3 
4 2017-07-20  2  NA 
+0

Danke Florian Maas, während die linke versuchen -join Ich habe das Problem mit 'index' gelöst: data [roownames (kk.df), colnames (kk.df) [2]] = as.numerisch (as.character (kk.df [2] [[1 ]])) Auf diese Weise immer y gaugin station wird zu dem Zeitpunkt gespeichert, der den rownames entspricht. – Marina

+0

Schön, dass Sie Ihr Problem lösen konnten, froh, dass ich Ihnen helfen konnte! – Florian