Fehler: { : missing value where TRUE/FALSE needed

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

Moderatoren: EDi, jogo

Antworten
baroso
Beiträge: 12
Registriert: Di Mär 06, 2018 11:11 am

Fehler: { : missing value where TRUE/FALSE needed

Beitrag von baroso »

Hallo,
R treibt mich mal wieder zum Wahnsinn!!
in einer for-Schleife versuche ich bestimmt Werte zu berechnen:
if (daten[,e1] <=x) {daten[e2]= 1}
else if (daten[,e1] > x & daten[,e1] <=y) {daten[e2]= 2}
else {daten[e2] = 3}

es kommt die Fehlermeldung: Error in if (daten[, e1] <= 1.0) { : missing value where TRUE/FALSE needed

Mir ist klar, dass x=NA sein kann und somit der Fehler entsteht.
Aber was soll tun, es sind nunmal NA´s in der Liste enthalten.
Hat jemand einen Lösungsvorschlag??
Danke.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von jogo »

Hallo baroso,

willkommen im Forum!
Was ist denn das für ein Objekt mit dem Namen daten ?
Kannst Du bitte mal den Output von

Code: Alles auswählen

str(Daten)
in Deine nächste Nachricht kopieren?

BTW:
Beachte den Unterschied zwischen daten[e2] und daten[, e2]
Und was soll passieren bei den NA-Werten?

Gruß, Jörg
baroso
Beiträge: 12
Registriert: Di Mär 06, 2018 11:11 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von baroso »

hallo Jörg,
danke für die schnelle Antwort.
in daten sind verschiedene Zahlenwerte abgelegt (siehe unten)
mit daten[,e1] spreche ich den Spaltenwert eines vorher selektierten (for Schleife)Datensatzes an.
mit daten[e2] bestimme ich die spalte in der das ergebnis geschrieben werden soll.
hoffe das stimmt soweit.
Wenn x=NA ist sollte nix passieren, d.h. keine Berechnung möglich also Ergebnis = NA
Danke fürs mitdenken...

> str(daten)
'data.frame': 1 obs. of 56 variables:
$ NR : int 2016
$ PROJECT : Factor w/ 1 level "oid_28": 1
$ PROBENART : Factor w/ 1 level "just": 1
$ VAR_ID : int 256
$ PROBE : Factor w/ 161 levels "NR_01","NR_02",..: 14
$ MHIJH_ST : logi NA
$ IKH_ID : Factor w/ 7 levels "fi7_1","iu2_3",..: 1
$ KA: int 1
$ KLK: int 1
$ REMARKS : Factor w/ 6 levels "","just3, keine Probe",..: 1
$ NO_ : int 256558
$ date: Factor w/ 3 levels "09-Mrz-16","09-Mrz-16",..: 1
$ OIU: logi NA
$ O : num 0.1
$ O_SI : Factor w/ 2 levels "","g/kg [171]": 2
$ ZUZ: num 3.83
...
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von jogo »

Hallo baroso,
baroso hat geschrieben: Di Mär 06, 2018 11:51 am in daten sind verschiedene Zahlenwerte abgelegt (siehe unten)
mit daten[,e1] spreche ich den Spaltenwert eines vorher selektierten (for Schleife)Datensatzes an.
mit daten[e2] bestimme ich die spalte in der das ergebnis geschrieben werden soll.
hoffe das stimmt soweit.
leider ist das falsch. Wenn daten ein Dataframe ist, dann indiziert daten[e2] den Dataframe als Liste. Das Ergebnis ist nicht ein Vektor sondern ein Dataframe (also eine Liste).
Du meinst jetzt aber nicht daten$e1 bzw. daten$e2 (bitte auch beachten, dass R pingelig ist bezüglich Groß- oder Kleinschreibung):
daten$e2 ist etwas anderes als daten$E2

Code: Alles auswählen

Wenn x=NA ist sollte nix passieren, d.h. keine Berechnung möglich also Ergebnis = NA 
Danke fürs mitdenken... 
Da Du den Vergleich mit einem Vektor (einer ganzen Spalte) durchführen möchtest, kannst Du nicht if (...) ... verwenden. Du solltest Dir die Funktion ifelse(...) anschauen. Das könnte dann evtl. so aussehen:

Code: Alles auswählen

daten$e2 <- 2
daten$e2 <- ifelse(daten$e1 <=x, 1, daten$e2)
daten$e2 <- ifelse(daten$e1 >y,   3, daten$e2)
bestimmt kann man alternativ auch cut() verwenden.
Bezüglich der NA macht das R so: wenn ein Wert eine Operation NA ist, dann ist auch das Ergebnis NA
(das ist so, wie Du es möchtest).

Code: Alles auswählen

> str(daten)
'data.frame':	1 obs. of  56 variables:
 $ NR       : int 2016
...
$e1 bzw. $E1 waren jetzt nicht zu sehen - die kommen dann später in der Ausgabe, richtig?

Gruß, Jörg
p.s.:
Das ist richtig, dass Dein Dataframe nur eine Beobachtung hat?
Kann es sein, dass Du ursprünglich 161 Beobachtungen hattest?
in einer for-Schleife versuche ich bestimmt Werte zu berechnen: ...
Die Schleife hast Du uns auch bisher nicht gezeigt ...
baroso
Beiträge: 12
Registriert: Di Mär 06, 2018 11:11 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von baroso »

Ja mit elseif funktioniert es.
Danke!!
(warum if bei NA´s nicht funktioniert, ist mir aber immer noch unklar).

p.s.:
Das ist richtig, dass Dein Dataframe nur eine Beobachtung hat?
Kann es sein, dass Du ursprünglich 161 Beobachtungen hattest?

- ja, das ist noch ein Problem. habe die Daten mit subset bis auf eine Datenzeile reduziert.
Hierzu folgende Skriptzeilen. Kann man mit einer Schleife (oder wie auch immer) die Zeilensumme für jede Zeile berechnen und dies zusammen in ein dataframe abspeichern? Steh absolut auf dem Schlauch...


x=c(1,2,3,4,5,6,7,8,9,10)
y=c(21,22,23,24,25,26,27,28,29,30)

daten=cbind(x,y)
daten

# wie erstelt man eine zusätzliche Spalte ("Summe") in der die Summe der jeweiligen Zeile steht?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von bigben »

Unter Verwendung von code - Tags, um den Code lesbarer zu machen:

Code: Alles auswählen

bsp <- data.frame(a=c(-1,0,2), b=c(-2, -1, 3))
print(bsp)
#Zusätzliche Summenspalte
bsp$Zeilensumme <- rowSums(bsp)
print(bsp)
HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von jogo »

Code: Alles auswählen

daten <- cbind(
  x=c(1,2,3,4,5,6,7,8,9,10),
  y=c(21,22,23,24,25,26,27,28,29,30))
daten
s <- rowSums(daten)
D <- cbind(daten, s)
# noch schöner geht es mit Dataframes:
daten <- data.frame(
  x=c(1,2,3,4,5,6,7,8,9,10),
  y=c(21,22,23,24,25,26,27,28,29,30))
daten$Summe <- rowSums(daten)
Gruß, Jörg
p.s.:
Bitte mal lesen: viewtopic.php?f=20&t=29
und in den nächsten Nachrichten selber die Formatierung anwenden.
baroso
Beiträge: 12
Registriert: Di Mär 06, 2018 11:11 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von baroso »

simpel... :shock:
geht das auch mit logischen Verknüpfungen.
z.B. prüfe für alle Zeilen, ob x > y ist. Füge in neuer Spalte ("Prüf") 1 für ja und 2 für nein ein.
Dafür ist eine Schleife notwendig, oder geht das auch ohne??
Danke!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von jogo »

geht alles ohne Schleife:

Code: Alles auswählen

daten <- data.frame(
  x=c(1,2,3,4,105,6,107,8,9,10),
  y=c(21,22,23,24,25,26,27,28,29,30))
daten$x.gt.y <- with(daten, x>y)
Du kannst doch damit leben, dass dort einfach die logischen Werte TRUE bzw. FALSE stehen, oder?

... oder Du nimmst wieder ifelse()

Code: Alles auswählen

daten$x.gt.y <- with(daten, ifelse(x>y, "ja", "nein"))
Eigentlich sind die meisten Objekte, mit denen R rumwirbelt, mindestens Vektoren. Man muss sich daran gewöhnen (besonders wenn man vorher nur Programmiersprachen der 3. Generation kennengelernt hat), dass man immer gleich mit den ganzen Objekten arbeitet.

Gruß, Jörg
baroso
Beiträge: 12
Registriert: Di Mär 06, 2018 11:11 am

Re: Fehler: { : missing value where TRUE/FALSE needed

Beitrag von baroso »

Danke! Ihr seid super!!
Antworten