Seite 1 von 1

während des einlesens bestimmten string mit NA ersetzen

Verfasst: Mi Aug 02, 2017 7:40 am
von jessi
Hallo,

ich versuche derzeit Messdaten mittels sql-Abfrage einzulesen. Bei einem Element funktioniert die Abfrage leider nicht. Ich lese folgenderweise ein:

Code: Alles auswählen

date <- dbGetQuery(con, 'SELECT tag, phi, lam, boen FROM data WHERE tag IN ("20110317") AND phi >= 31 AND phi <= 60 AND lam >= 16 AND lam <=30')
Für das Element boen bekomme ich jetzt folgende Fehlermeldung

Code: Alles auswählen

In rsqlite_fetch(res@tr, n = n):
column 'boen': mixed type, first seen values of type string, coercing other values of type real
In boen sind Fehlwerte mit dem String "ex" belegt, solche Einträge möchte ich jetzt gerne beim Einlesen ersetzten mit NA, damit der Eintrag erhalten bleibt. Die Deklaration NA erkennt R als Fehlwert und berücksichtigt/vernachlässigt ihn dementsprechend?

Danke für eure Vorschläge.

jess

Re: während des einlesens bestimmten string mit NA ersetzen

Verfasst: Mi Aug 02, 2017 2:43 pm
von jogo
Hallo Jess,

wenn Du ein paar Daten liefern könntest, würde ich mich mal daran versuchen.
Aus SQLite heraus bräuchte ich den Output von folgenden Befehlen:

Code: Alles auswählen

.schema data
.mode insert data
select * from data limit 10 ;
Gruß, Jörg

Re: während des einlesens bestimmten string mit NA ersetzen

Verfasst: Mi Aug 02, 2017 7:01 pm
von EDi
Ich finde das neue DBI + odbc + dbplyr ziemlich schick und zugänglich:

http://blog.revolutionanalytics.com/201 ... for-r.html

Vielleicht eine alternative zu SQL (anfangs zumindest)?

Außerdem: Ist das tatsächlich eine FEHLERmeldung oder eine WARNUNG?
Die umwandlung würde ich in R machen (und nicht in SQL), is ja nicht so wild, irgendwie sowas

Code: Alles auswählen

as.numeric(ifelse(x == 'ex', NA, x))

Re: während des einlesens bestimmten string mit NA ersetzen

Verfasst: Mi Aug 02, 2017 8:38 pm
von jessi
Hallo Jörg,

leider habe ich selbst keinen Zugriff auf die sql-db (nur den Pfad, damit ich einlesen kann).
Ich kann dir den Output der dbGetQuery-Befehls aus R liefern:

Code: Alles auswählen

date <- dbGetQuery(conn, 'SELECT * FROM table WHERE tag In ("20130102", "20130103","20130104")  AND phi >= 31 AND phi <= 60 AND lam >= 16 AND lam <=30 LIMIT 10')

str(date)

'data.frame': 15892331obs. of 8 variables:
$timestemp: chr "20133101-0000" ... 
$tag: chr "20130102" "20130102" "20130102" "20130102" ...
$zeit: chr "0000" "0000" "0000" ...
$phi: num 31 31 31 31 31 31 31...
$lam: num 16 17 18 19 20 21 22 ...
$temp: num -3.5 5 -0.2 1.7 ... 
$t_max: chr 0.5 "ex" "ex" "ex" 3.1 ... 
$boen: chr "ex" 0.5 1.7 "ex" "ex" 0.9 ... 
Die ausgegebene Meldung ist eine Warnung. Ich habe festgestellt, dass R die Daten trotz Warnung einliest, nur t_max und boen dann nicht mehr numerisch sind, sondern characters.

Ich hätte dann dazu folgendes probiert:
Mit der Zeile

Code: Alles auswählen

 my2num <- function(x) as.numeric(sub(",", ".", x)) 
date[] <- lapply(date, my2num) 
kann ich alle Spalten der Matrix date in numerische Elemente umwandeln und R schreibt dann danach statt "ex" NA hin. Leider habe ich jetzt aber noch nicht rausgefunden, wie ich nur bestimmte Spalten, in diesem Fall jetzt t_max und boen, umwandle und die anderen Einträge von date so belasse wie sie sind.

Vielen dank!
Jessi

Re: während des einlesens bestimmten string mit NA ersetzen

Verfasst: Mi Aug 02, 2017 10:28 pm
von jogo

Code: Alles auswählen

D <- dbGetQuery(...)
D$t_max <- my2num(D$t_max)
D$boen <- my2num(D$t_max)
oder

Code: Alles auswählen

D <- transform(D, t_max=my2num(t_max), boen=my2num(boen))
Vielleicht geht auch:

Code: Alles auswählen

s <- c("t_max", "boen")
D[s] <- lapply(D[s], my2num)
Gruß, Jörg