Zeitperiode mit Werten "füllen"

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Zeitperiode mit Werten "füllen"

Beitrag von Ilonia »

Hallo zusammen,

ich habe da mal wieder ein Problemchen.

Ich habe 2 dfs, df1 und df2

Code: Alles auswählen

df1= =structure(list(Station = c("Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station1", "Station1", 
                               "Station1", "Station1", "Station1", "Station1", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2", "Station2", 
                               "Station2", "Station2", "Station2", "Station2", "Station2"), 
                   Timestamp = structure(c(1504994400, 1504998000, 1505001600, 
                                           1505005200, 1505008800, 1505012400, 1505016000, 1505019600, 
                                           1505023200, 1505026800, 1505030400, 1505034000, 1505037600, 
                                           1505041200, 1505044800, 1505048400, 1505052000, 1505055600, 
                                           1505059200, 1505062800, 1505066400, 1505070000, 1505073600, 
                                           1505077200, 1505080800, 1505084400, 1505088000, 1505091600, 
                                           1505095200, 1505098800, 1505102400, 1505106000, 1505109600, 
                                           1505113200, 1505116800, 1505120400, 1505124000, 1505127600, 
                                           1505131200, 1505134800, 1505138400, 1505142000, 1505145600, 
                                           1505149200, 1505152800, 1505156400, 1505160000, 1505163600, 
                                           1505167200, 1504994400, 1504998000, 1505001600, 1505005200, 
                                           1505008800, 1505012400, 1505016000, 1505019600, 1505023200, 
                                           1505026800, 1505030400, 1505034000, 1505037600, 1505041200, 
                                           1505044800, 1505048400, 1505052000, 1505055600, 1505059200, 
                                           1505062800, 1505066400, 1505070000, 1505073600, 1505077200, 
                                           1505080800, 1505084400, 1505088000, 1505091600, 1505095200, 
                                           1505098800, 1505102400, 1505106000, 1505109600, 1505113200, 
                                           1505116800, 1505120400, 1505124000, 1505127600, 1505131200, 
                                           1505134800, 1505138400, 1505142000, 1505145600, 1505149200, 
                                           1505152800, 1505156400, 1505160000, 1505163600, 1505167200
                   ), tzone = "GMT", class = c("POSIXct", "POSIXt"))), row.names = c(NA, 
                                                                                     -98L), class = "data.frame")
und

Code: Alles auswählen

df2= structure(list(Station = c("Station1", "Station1", "Station2", 
"Station2", "Station2", "Station2", "Station1"), Beginn = structure(c(1505001600, 
1505012400, 1505008800, 1505041200, 1505059200, 1505080800, 1505109600
), tzone = "UTC", class = c("POSIXct", "POSIXt")), Ende = structure(c(1505008800, 
1505016000, 1505012400, 1505048400, 1505062800, 1505091600, 1505113200
), tzone = "UTC", class = c("POSIXct", "POSIXt")), Class = c("SIR", 
"SIR", "SLR", "SIR", "SLR", "SLR", "SLR")), row.names = c(NA, 
-7L), class = "data.frame")
In df1 habe ich durchgehende stündliche Werte für 2 Stationen.
In df2 habe ich eine Klasse ("Class") bei der zwischen zwei Zeitschritten ("Beginn" und "Ende") was aufgezeichnet wird.
Ich würde jetzt gerne in df1 eine neue Spalte "Class" einfügen, bei der Spalteninhalt von df2 während dieser Messperiode übertragen wird.

Versucht hatte ich das mit

Code: Alles auswählen

ifelse()
folgendermaßen:

Code: Alles auswählen

df1$class <- ifelse(df1$Station==df2$Station & df1$Timestamp ==df2$Beginn | df1$Timestamp == df2$Ende, df2$Class,NA)
leider ohne Erfolg.
Wahrscheinlich ist das einfachste das mit einer for-Schleife zu lösen...
aber das hat irgendwie auch nicht so ganz funktioniert. Hier mal mein Ansatz dazu...

Code: Alles auswählen

 for(i in 1:nrow(df1)){
   df1$class[i] <-df2$class[which(df1$Station[i] == df2$Station & 
                  df1$Timestamp[i]>= df2$Beginn&
                   df1$Timestamp[i]<= df2$Ende)]
 }
 
Vielleicht hat einer von euch noch eine Idee mein Problem zu lösen?
Vielen Dank schonmal für eure Bemühungen.

Liebe Grüße
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zeitperiode mit Werten "füllen"

Beitrag von Athomas »

Mir fällt da spontan "foverlaps" aus dem Package "data.table" ein ...
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Re: Zeitperiode mit Werten "füllen"

Beitrag von Ilonia »

Hallo Athomas,

vielen Dank für deine schnelle Antwort.
Mit "foverlaps" hatte ich bisher noch keine Erfahrung gemacht, hatte aber mit Hilfe von Dr.Google eine SO gefunden dass mir schon etwas geholfen hatte.
Ich habe es jetzt soweit, dass ich mit zumindest schonmal anzeigen lassen konnte, wann bei den Zeitschritten von DF1 eine Periode auch in DF2 definiert ist. also mein Code schreibt eine 0 für "nicht vorhanden" oder 1 für "vorhanden"
Jedoch schaffe ich es nicht, mir die Werte der ursprünglichen "Class" anzeigen zu lassen.

Hat hier jemand noch einen Tipp/Hinweis?

Code: Alles auswählen

 dt1 <- data.table(ID=df1$Station, start=df1$Timestamp, end=df1$Timestamp) #Umwandlung df zu dt
 setkeyv(dt1, colnames(dt1)) #key setzen
 dt2 <- as.data.table(df2[,1:3]) #df2 zu dt
 setnames(dt2, 1:3, c("ID",'start', 'end')) #rename
  setkeyv(dt2, colnames(dt2))# key setzen
 
 indx <- foverlaps(dt1, dt2, type='within', which=TRUE, mult='first') 
 dt1[, Class:= +(!is.na(indx))] [,end:=NULL] #Class zu 0 (nicht vorhanden) oder 1(vorhanden) setzen
 
das ganze habe ich von hier (leicht angepasst):
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zeitperiode mit Werten "füllen"

Beitrag von Athomas »

Fang mal hiermit an:

Code: Alles auswählen

library(data.table)    

dt1 <- data.table(df1)
setnames(dt1, "Timestamp", "Beginn")
dt1[  , Ende := Beginn]

dt2 <- data.table(df2)
setkey(dt2, Station, Beginn, Ende)

Zsamma <- foverlaps(dt1, dt2, type='any') 
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Re: Zeitperiode mit Werten "füllen"

Beitrag von Ilonia »

Hallo Athomas,
vielen Dank für deine Hilfe.
Das hat mir sehr weitergeholfen, und ich kann gut damit weiterarbeiten!

LG :)
Antworten