fortlaufend einlesen

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

Moderatoren: EDi, jogo

Antworten
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

fortlaufend einlesen

Beitrag von jessi »

Hallo zusammen,

wieder mal ist Sonntag und wieder mal stehe ich vor R Problemen :(

Ich habe unterschiedliche Messwerte, welche in einer Datenbank abgelegt sind. Diese habe ich bereits ein- bzw. auch ausgelesen.

Code: Alles auswählen

library(RSQLite)
m <- dbDriver("SQLite")
con <- dbConnect(m, dbname = "daten_datum.sqlite")

alltables <- dbListTables(con)
alltables

my2num <- function(x) as.numeric(sub(",", ".", x)) #in Zahlen umwandeln 
messdaten <- dbGetQuery(con, 'SELECT * FROM data') # alle Daten einlesen 
messdaten[] <- lapply(messdaten, my2num)

#Daten einschränken 
daten_ort <- subset(messdaten, p >= 48 & p <= 53 & l >= 10 & l <= 16)
Die Messdaten sind in der Auflösung von einer Minute mit dem Zeitstempel yyyymmddhhmm (201101071214, 201101071215 ...). Allerdings soll ich nicht gesamten Messdaten auswerten, sondern nur für bestimmte Tage, also zB. für den 14.01, 15.01, 21.02, 23.05. Aus diesen Tagen berechnet ich dann den Median von beispielsweise den Wind-Daten an den bestimmten Orten (p & l).

Zuerst habe ich es so probiert zum Einlesen

Code: Alles auswählen

messdaten_datum <- dbGetQuery(con, 'SELECT * FROM data 
					WHERE "Datum" = 20110113
					  OR "Datum" = 20110315
			                  OR "Datum" = 20110316
			                  OR "Datum" = 20110322
			                  ... ')
Das funktioniert leider nicht, da ja mein (Tages)-Datum fortlaufend abgespeichert ist, und wenn möglich, möchte ich nicht alle Werte bis zur Minute händisch eingeben. Nun meine Frage gibt es eine Möglichkeit den ersten Teil des Datums (also yymmdd) zu fixieren und dann die hh und min durchlaufen zu lassen, damit ich den gesamten Tag einlesen kann? Benötige ich dazu eine for-Schleife bzw. mehrer for-Schleifen (weil ich ja mehrere Tage einlese). Das Datum ist in meiner Datei zuerst als CHR abgespeichert, wandle ich aber im obigen Code in NUM um. Ich hoffe, ich habe meine Problem einigermaßen verständlich erklärt und würde mich freuen, wenn mir vielleicht jemand weiterhelfen könnte.

Vielen Dank schon mal und glg
J
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: fortlaufend einlesen

Beitrag von jogo »

Hallo Jessi,
jessi hat geschrieben: So Jul 16, 2017 10:00 amIch habe unterschiedliche Messwerte, welche in einer Datenbank abgelegt sind. Diese habe ich bereits ein- bzw. auch ausgelesen.

Code: Alles auswählen

library(RSQLite)
m <- dbDriver("SQLite")
con <- dbConnect(m, dbname = "daten_datum.sqlite")

alltables <- dbListTables(con)
alltables

my2num <- function(x) as.numeric(sub(",", ".", x)) #in Zahlen umwandeln 
messdaten <- dbGetQuery(con, 'SELECT * FROM data') # alle Daten einlesen 
messdaten[] <- lapply(messdaten, my2num)

#Daten einschränken 
daten_ort <- subset(messdaten, p >= 48 & p <= 53 & l >= 10 & l <= 16)
bitte poste doch mal das Ergebnis von:

Code: Alles auswählen

messdaten <- dbGetQuery(con, 'SELECT * FROM data') # alle Daten einlesen 
str(messdaten)
Die Messdaten sind in der Auflösung von einer Minute mit dem Zeitstempel yyyymmddhhmm (201101071214, 201101071215 ...). Allerdings soll ich nicht gesamten Messdaten auswerten, sondern nur für bestimmte Tage, also zB. für den 14.01, 15.01, 21.02, 23.05. Aus diesen Tagen berechnet ich dann den Median von beispielsweise den Wind-Daten an den bestimmten Orten (p & l).
Wenn in Deinen Daten ein Datum in der Form yyyymmddhhmm kodiert ist, wird die Umwandlung nach numerisch die Daten zerstören wegen: https://stackoverflow.com/questions/950 ... -not-equal

Du musst das Datum extra in eine Datumsvariable konvertieren oder (andere Variante) Du zerhackst die Datumszeichenkette in ihre Bestanteile Jahr, Monat, Tag, Stunde, Minute (z.B. mit Hilfe der entsprechenden Stringfunktionen).
Jedenfall darf die Funktion as.numeric() nicht über ein Datum der Form yyyymmddhhmm laufen.

Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: fortlaufend einlesen

Beitrag von jessi »

Hi Jörg,
bitte poste doch mal das Ergebnis von:

messdaten <- dbGetQuery(con, 'SELECT * FROM data') # alle Daten einlesen
str(messdaten)
Das Ergebnis der Kommandozeile

Code: Alles auswählen

 messdaten <- dbGetQuery(con, 'SELECT Zeitstempel, p, l, v FROM data')
str(messdaten)

'data.frame':   165699 obs. of  4 variables:
 $ Zeitstempel: chr  "201103130000" "201103130000" "201103130000" "201103130000" ...
 $ p         : chr  "48" "48" "48" "48" ...
 $ l      : chr  "10" "11" "12" "13" ...
 $ v       : chr  "2" "1" "10" "-99" ...
LG, J
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: fortlaufend einlesen

Beitrag von jogo »

Hallo Jessi,

dann mach doch folgendes:

Code: Alles auswählen

messdaten <- dbGetQuery(con, 'SELECT Zeitstempel, p, l, v FROM data')
my2num <- function(x) as.numeric(sub(",", ".", x)) # in Zahlen umwandeln 
messdaten[-1] <- lapply(messdaten[-1], my2num)
messdaten <- transform(messdaten, 
  Tag=substr(Zeitstempel, 1, 8), Stunde=substr(Zeitstempel, 9, 10), 
  Minute=substr(Zeitstempel, 11, 12))
bezüglich des Zeitstempels habe ich mal dieses Beispiel gerechnet:

Code: Alles auswählen

messdaten <- data.frame(Zeitstempel=c("201103130043", "201103131234", "201103130000", "201103130000"))
messdaten <- transform(messdaten, 
  Tag=substr(Zeitstempel, 1, 8), Stunde=substr(Zeitstempel, 9, 10), 
  Minute=substr(Zeitstempel, 11, 12))
messdaten
Gruß, Jörg
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: fortlaufend einlesen

Beitrag von jessi »

Hallo Jörg,

vielen Dank :) Die Tag-Abfrage kann ich jetzt auch mit einer subset machen.

Code: Alles auswählen

daten_nach_datum <- subset(daten, Tag == 20110113
					            & Tag == 20110215
					            & Tag == 20110216)
LG. Jess
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: fortlaufend einlesen

Beitrag von jogo »

Hallo Jess,

NEIN!!! (zumindest nicht zusammen mit dem Code, den ich voher geschrieben habe)
Du musst bedenken, dass $Tag ein chr ist (bzw. factor, was bei der Operation zu chr konvertiert wird), also:

Code: Alles auswählen

daten_nach_datum <- subset(daten, Tag %in% c("20110113", "20110215", "20110216"))
Gruß, Jörg
Antworten