Mit while durch Excelfile gehen und Änderungen vornehmen

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

Moderatoren: EDi, jogo

bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von bigben »

Der Fehler tritt dann auf, wenn in der ersten Spalte das Abbruchkriterium "" gar nicht auftritt. Dann wird die Laufvariable irgendwann größer als die Länge der Spalte und x kann keine Werte mehr liefern, die sich mit "" vergleichen ließen. Kannst Du so reproduzieren:

Code: Alles auswählen

v1 <- c( "WBEB_4123_ID", "EIÖI_2872_ID", "MSPS_1564_ID", "BLÖL_1074_ID", "")
n <- 1
while(v1[n] != ""){
  cat(n)
  n <- n+1
}

v2 <- v1[1:4] # gleicher Vektor wie v1, aber diesmal fehlt das "" am Ende
n <- 1
while(v2[n] != ""){
  cat(n)
  n <- n+1
}
LG,
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: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von jogo »

Hallo Leonard!
leonard_24 hat geschrieben: Di Aug 07, 2018 10:47 am 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.
Sowohl das iterieren bezüglich der Zeile (was durch die vektorisierte Verarbeitung meist unnötig ist) als auch das Durchlaufen der Spalten - beides sind Aufgaben, für die man nicht zwingend eine while-Schleife benötigt.
Bernhard hat den Fehler prima aufgedeckt (chapeau!); dieser wäre mit einer for-Schleife der Form
for (n in 1:nrow(x)) { ... } nicht passiert. Die for-Schleifen sind um einiges sicherer in ihrer Anwendung als while-Schleifen.
Die komplette Freiheit bei der Programmierung von while-Schleifen beinhaltet auch ein hohes Risiko.
Wenn Du uns konkrete Datenbeispiele lieferst, können wir auch konkrete Hilfe (=Code) liefern. viewtopic.php?f=20&t=11

Gruß, Jörg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von bigben »

@jogo: Coole Frage, hast ein Upvote von mir. '->' habe ich so weit aus meinen Gedanken verdrängt ...

@leonard_24
leonard_24 hat geschrieben: Di Aug 07, 2018 10:47 am 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.
Warum das nur mit einer Schleife zu lösen sein soll, erklärst Du leider nicht. Für solche Standardaufgaben gibt es meistens nicht nur eine, sondern viele Lösungen. Entscheidend ist Jörgs Hinweis, dass Du (beispielsweise mit nrow) auslesen solltest, wieviele Zeilen da sind und dann mit einer Schleife Deiner Wahl bis zu dieser Zahl läufst.
Wenn Du aus einer anderen Programmiersprache kommst und mit Schleifen vertraut bist, spricht nichts dagegen, erstmal mit Schleifen Deine Probleme zu lösen. Es lohnt sich aber, sich irgendwann mit den Fähigkeiten von R auseinander zu setzen und sie zu nutzen. Wenn Du wirklich in allen "Zellen" dieser Dataframes immer die gleiche Ersetzung vornehmen willst, dann böte sich in R die Funktion apply an. Wie gesagt, Du kannst das mit einer Schleife Deiner Wahl machen, aber schau Dir auch dieses Beispiel einmal an:

Code: Alles auswählen

# Die Zahl der Zeilen kannst Du hier beliebig ändern
zeilen <- 20

# Ein Beispieldatensatz aus Zahlen
beisp <- data.frame(a = runif(zeilen), b=runif(zeilen), c=runif(zeilen))

# Eine einfache Funktion, die auf jede Zahl in jeder Spalte angewandt werden kann
pro_zelle <- function(n) round(n,1)*10

# Mit einer einfachen Codezeile die Funktion auf jede "Zelle" anwenden
apply(X = beisp, MARGIN = 1:2, FUN = pro_zelle)
Wie Du siehst, entsteht sehr kurzer Code, in dem sich dann auch Fehler nicht mehr ganz so gut verstecken können. In diesem Fall wäre es sogar noch kürzer und wahrscheinlich noch schneller gegangen ( pro_zelle(beisp) ), aber apply ist da sehr universell einsetzbar.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von bigben »

bigben hat geschrieben: Di Aug 07, 2018 8:00 amWenn schon Praefixnotation, dann auch konsequent:

Code: Alles auswählen

'<-'(b, '+'('+'(3, 4), 11))
Da kommt das '+' aber noch doppelt vor, sieht ein bisschen aus, als wäre der Code durch Copy&Paste entstanden. Wie wäre es daher mit

Code: Alles auswählen

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

oder einfach und übersichtlich:

Code: Alles auswählen

library(magrittr)

3 %>% c %>% c(4) %>% c(11) %>% sum -> b
:!:

Ist schon irgendwie heiß, draußen...
---
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: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von jogo »

bigben hat geschrieben: Di Aug 07, 2018 2:55 pm @jogo: Coole Frage, hast ein Upvote von mir. '->' habe ich so weit aus meinen Gedanken verdrängt ...
Danke ... und wegen der Verdrängung: ist besser so. :)
Die Antwort von Roland ist auf meine Frage aber auch sehr erhellend. :idea:

Gruß, Jörg
leonard_24

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von leonard_24 »

Ich verzichte darauf, alle einzelnen Antworten einzeln zu kommentieren.

Habt vielen herzlichen Dank an euch alle!!! Das hat meine Arbeit um einiges erleichtert. Da ich noch nicht so ein tiefes Wissen in R habe, dachte ich, dass eine Schleife die einzige Möglichkeit wäre.

Viele Grüße
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von bigben »

jogo hat geschrieben: Di Aug 07, 2018 3:50 pmDie Antwort von Roland ist auf meine Frage aber auch sehr erhellend. :idea:
Der hat auch mein Upvote bekommen, aber mal ehrlich, so richtig erhellt bin ich nicht:
both left and right assignment are parsed to the <- function
Warum? Wieso? Hat R jetzt einen Precompiler? Was ersetzt dieser Parser sonst noch so? Ist das ein Sonderfall der in den Parser als Sonderfall fest einprogrammiert ist oder folgt das einer allgemeinen Regel oder kann man das bei anderen Gelegenheiten selbst auch so implementieren?

Ich glaube ja schon lange, dass R einfach zu alt ist und dass zu viele Generationen da irgendwie dran 'rumgeschraubt haben und dass man da irgendwie mal durchwischen müsste, um das wieder elegant und durchschaubar zu machen.

JMTC,
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: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von jogo »

bigben hat geschrieben: Mi Aug 08, 2018 3:58 pm
jogo hat geschrieben: Di Aug 07, 2018 3:50 pmDie Antwort von Roland ist auf meine Frage aber auch sehr erhellend. :idea:
Der hat auch mein Upvote bekommen, aber mal ehrlich, so richtig erhellt bin ich nicht:
both left and right assignment are parsed to the <- function
Warum? Wieso? Hat R jetzt einen Precompiler?
Wie wir alle wissen, arbeitet R interpretativ.
Aber egal ob Interpreter oder Compiler, muss die Eingabe überprüft werden, ob sie denn syntaktisch korrekt ist.
Dafür ist der Parser zuständig.
Was ersetzt dieser Parser sonst noch so?
Im Zuge der Sytaxprüfung baut der Parser auch gleich die passenden Strukturbäume.
Dies hat Roland in der Antwort sehr schön vorgeführt. Man könnte jetzt sogar diese Strukturbäume manipulieren. (Die Funktion D() müsste sowas machen.)
Ist das ein Sonderfall der in den Parser als Sonderfall fest einprogrammiert ist oder folgt das einer allgemeinen Regel
Im Fall von "->" halte ich es für einen Sonderfall im Sinne von:
Da gibt es einen Operator, der nicht auf eine namensgleiche Funktion abgebildet wird sondern auf eine andere Funktion bei Vertauschung der Operanden.
oder kann man das bei anderen Gelegenheiten selbst auch so implementieren?
Zumindest ist der Parser zugänglich, man kann ihn nutzen und seine Ergebnisse manipulieren, bevor man einen Ausdruck evaluiert.
Ich glaube ja schon lange, dass R einfach zu alt ist und dass zu viele Generationen da irgendwie dran 'rumgeschraubt haben und dass man da irgendwie mal durchwischen müsste, um das wieder elegant und durchschaubar zu machen.
Meiner Meinung nach trifft das hauptsächlich auf Funktionen zu, die bei ähnlicher Funktionalität verschiedenen Aufrufkonventionen/Parameternamen besitzen - dies wird üblicherweise durch verschiedene Zusatzpakete geheilt. (Das würde aber auch bedeuten, dass wenn man diese Heilung akzeptiert, schon Anfänger an entsprechende Zusatzpakete heranführen sollte.)
Was den syntaktischen Aufbau, die Geltungsbereiche der Bezeichner, die Kapselung der Funktionen angeht und noch so einige Sachen halte ich R für recht modern und gut gelungen. (Dass das S3-System nur ein Pseudoklassensystem darstellt - man könnte such sagen sehr pragmatisch konstruiert ist, ist völlig klar ... hat aber auch gewisse Vorteile, die dann wieder in anderen Situationen zu Nachteilen werden.)

Gruß, Jörg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Mit while durch Excelfile gehen und Änderungen vornehmen

Beitrag von bigben »

Hi,

ja, das mit dem Precompiler war dämlich formuliert und ja, Roland hat das schön demonstriert. Wenn R sich mit nur einem Klassensystem zufrieden gäbe, dann dürfte das m. E. auch "sehr pragmatisch konstruiert" sein. Aber gleich drei Klassensysteme? Eins, das benutzt wird, eins, das die Zukunft sein soll und eins, das vielleicht mal in Mode kommt? Und wenn eine Sprache durch Zusatzpakete "geheilt" werden muss, dann ist sie doch vorher krank? Sonderfälle im Parser entsprechen nicht dem, was ich mir für eine Sprache wünschen würde, aber gut, da kommen wir mit dem Wünschen sofort in einen stark subjektiven Bereich und letztlich ändert das ja alles nichts daran, dass R auf Sicht die erste Wahl ist.

Vielleicht wäre es ja mal einen Thread wert, Pakete zur Sprachverbesserung zu sammeln, die es Wert sind, schon Anfänger an sie heranzuführen?

Und natürlich hast Du Recht. Alles
... hat aber auch gewisse Vorteile, die dann wieder in anderen Situationen zu Nachteilen werden.)
:!:

GLG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten