Seite 1 von 2

Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: So Aug 05, 2018 6:42 pm
von leonard_24
Hallo nochmal :)

habe folgendes Problem: Ich habe eine eingelesene Exceldatei (2 Spalten, ID und Firma) und möchte nun mittels einer Schleife durch die ID-Spalte gehen und die Zeichen "_" sowie "ID" entfernen, sodass z.B. in der ersten Zeile aus "WBEB_4123_ID" "WBEB4123" wird. Die Daten sind in der Variable "x" gespeichert.

Mein Code bisher:

n <- 1
while (x[n,1] != "") {

gsub ("_", "",x[n,1])
sub ("ID","", x[n,1])
n=n+1

}

Leider kommt als Fehlermeldung:

Error in while (x[n, 1] != " ") { : missing value where TRUE/FALSE needed

Kann mir jemand den Fehler sagen?

Gruß

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: So Aug 05, 2018 8:04 pm
von jogo
Hallo Leonard,

das geht ohne Schleife, weil R mit ganzen Vektoren arbeitet:

Code: Alles auswählen

x[, 1] <- gsub("_", "", sub("ID$", "", x[, 1]))
Test:

Code: Alles auswählen

y <- "WBEB_4123_ID"
gsub("_", "", sub("ID$", "", y))
Gruß, Jörg

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Mo Aug 06, 2018 2:23 pm
von bigben
Während Jörgs Vorgehen das ganz klar bessere ist, beantwortet das aber noch nicht die Frage, wo der Fehler her kommt.

Was gibt R denn aus, wenn Du

Code: Alles auswählen

x[1,1] != ""
eingibst. Bzw was bei

Code: Alles auswählen

str(x[1,1])
?

Wenn das den Fehler nicht erklärt, was passiert bei

Code: Alles auswählen

str(x)
head(x)
LG,
Bernhard

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Mo Aug 06, 2018 7:47 pm
von leonard_24
jogo hat geschrieben: So Aug 05, 2018 8:04 pm Hallo Leonard,

das geht ohne Schleife, weil R mit ganzen Vektoren arbeitet:

Code: Alles auswählen

x[, 1] <- gsub("_", "", sub("ID$", "", x[, 1]))
Test:

Code: Alles auswählen

y <- "WBEB_4123_ID"
gsub("_", "", sub("ID$", "", y))
Gruß, Jörg


Danke! Wusste gar nicht, dass das ohne Schleife geht :)
Kannst du mir vllt. kurz den Syntax erklären? Warum kann man den "sub" in den "gsub" reinschachteln, ohne, dass bei der "gsub" Funktion die Spalte als letztes Element in der Funktion auftaucht?

Viele Grüße

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Mo Aug 06, 2018 7:49 pm
von leonard_24
bigben hat geschrieben: Mo Aug 06, 2018 2:23 pm Während Jörgs Vorgehen das ganz klar bessere ist, beantwortet das aber noch nicht die Frage, wo der Fehler her kommt.

Was gibt R denn aus, wenn Du

Code: Alles auswählen

x[1,1] != ""
eingibst. Bzw was bei

Code: Alles auswählen

str(x[1,1])
?

Wenn das den Fehler nicht erklärt, was passiert bei

Code: Alles auswählen

str(x)
head(x)
LG,
Bernhard
Wenn ich str(x) mache, kommt:

data.frame': 99 obs. of 10 variables:
$ ID : chr "WBEB_4123_ID" "EIÖI_2872_ID" "MSPS_1564_ID" "BLÖL_1074_ID" ...
$ Firma : chr "Walmart" ...
...

also so wie es sein sollte. Mit str(x[1,1]) kommt chr "WBEB_4123_ID"
Den Fehler habe ich also bisher noch nicht gefunden...

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Mo Aug 06, 2018 8:35 pm
von jogo
leonard_24 hat geschrieben: Mo Aug 06, 2018 7:47 pm
jogo hat geschrieben: So Aug 05, 2018 8:04 pm das geht ohne Schleife, weil R mit ganzen Vektoren arbeitet:

Code: Alles auswählen

x[, 1] <- gsub("_", "", sub("ID$", "", x[, 1]))
Test:

Code: Alles auswählen

y <- "WBEB_4123_ID"
gsub("_", "", sub("ID$", "", y))
Danke! Wusste gar nicht, dass das ohne Schleife geht :)
Es ist in R ganz selten, dass eine explizite Schleife wirklich notwendig ist.
Kannst du mir vllt. kurz den Syntax erklären? Warum kann man den "sub" in den "gsub" reinschachteln, ohne, dass bei der "gsub" Funktion die Spalte als letztes Element in der Funktion auftaucht?
Die Dokumentation von sub() sagt im Abschnitt Value, dass als Ergebnis die veränderte Zeichenkette bzw. der char-Vektor zurückgliefert wird.
Na ja, und dieser Vektor wird gleich weiter verarbeitet.
Das ist nicht sehr viel anders als statt

Code: Alles auswählen

a <- 3+4
b <- a + 11
zu rechnen:

Code: Alles auswählen

b <- (3+4) +11
oder möchtest Du lieber schreiben:

Code: Alles auswählen

b <- '+'('+'(3, 4), 11)
:?:

Gruß, Jörg

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Mo Aug 06, 2018 11:44 pm
von EDi
Polnische Notation? https://en.m.wikipedia.org/wiki/Polish_notation
oder möchtest Du lieber schreiben:G

Code: Alles auswählen

b <- '+'('+'(3, 4), 11)
:?:

Gruß, Jörg

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Di Aug 07, 2018 8:00 am
von bigben
jogo hat geschrieben: Mo Aug 06, 2018 8:35 pm

Code: Alles auswählen

b <- '+'('+'(3, 4), 11)
NEin, sowas möchte ich nicht schreiben. Wenn schon Praefixnotation, dann auch konsequent:

Code: Alles auswählen

'<-'(b, '+'('+'(3, 4), 11))

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Di Aug 07, 2018 8:14 am
von jogo
sehr gut!
Da ist mir wieder ein Schmankerl entwischt. :lol:

Danke, Bernhard, Du hast mich auf meine erste Frage auf SO gebracht:
https://stackoverflow.com/questions/517 ... s-an-error

Gruß, Jörg

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Verfasst: Di Aug 07, 2018 10:47 am
von leonard_24
danke an euch! Hat vielleicht trotzdem einer eine Idee, warum die While Schleife nicht funktioniert.
Ich brauche nämlich dringend den Fehler, da meine Aufgabe, denke ich, nur mit einer while - Schleife funktioniert. Hier das Problem: (Ich erwarte nicht, dass mir irgendjemand einen Code gibt, nur eine Idee, warum mein Code nicht funktioniert):

Das Problem ist nämlich, ich arbeite mit einer Datenbank, die viele Firmen enthält; für jede gibt es eine Excelfile mit unterschiedlich vielen Entitäten. Jede Firma hat eine bestimmte Menge an Standardspalten (z.B. A bis O) wobei jede eine unterschiedliche Anzahl an zusätzlichen Spalten (Nr.1... Nr.n) besteht. Das Ziel ist es nun, abhängig von der Zeilenzahl und Spaltenzahl, jeweils durch die einzelnen Spalten zu gehen und diese Korrektur durchführen (bestimmtes Zeichen ersetzen). D.h. Spalte "Nr.1" soll durch alle Zeilen gehen und die Substitution durchgehen, anschließend Spalte "Nr.2" usw. bis man zur Spalte "Nr.n" gekommen ist.
Viele Grüße