während des einlesens bestimmten string mit NA ersetzen

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

während des einlesens bestimmten string mit NA ersetzen

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

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

Beitrag 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))
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

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

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
Antworten