So verwenden Vektorisierung mit if-Anweisungen in R

Vektorisierung ist eines der bestimmenden Merkmale der R Sprache. R wäre R nicht, wenn es nicht eine Art von vektorisiert Version eines hatte ansonsten

Erklärung.

Das Problem

Das Preiskalkulator () Funktion ist noch nicht sehr ergiebig. Wenn Sie 100 Kunden haben, werden Sie den Preis für jeden Kunden einzeln berechnen müssen. Überprüfen Sie selbst, was passiert, wenn Sie hinzufügen, beispielsweise drei unterschiedliche Mengen an Stunden als Argument:

> Preiskalkulator (c (25110)) [1] 1060 4664Warning Nachricht: In if (Stunden> 100) net.price lt; - net.price * 0,9: hat die Bedingung Länge> 1, und nur das erste Element wird verwendet,

Nicht nur, dass R warnen Sie, dass etwas faul vor sich geht, aber das Ergebnis man bekommt, ist einfach falsch. Statt 4.664 $, sollte der zweite Client nur 4.198 $ in Rechnung gestellt:

> Preiskalkulator (110) [1] 4198

Die Warnmeldung sollte Ihnen eine Vorstellung darüber, was hapened. Ein ob Anweisung kann nur mit einem einzigen Wert beschäftigen, sondern der Ausdruck Stunden> 100 zwei Werte zurück, wie durch den folgenden Code dargestellt:

> C (25, 110)> 100 [1] FALSE TRUE

Wählen Sie auf einem logischen Vektor in R basiert

Die Lösung, die Sie suchen ist der ansonsten() Funktion, die eine vektorisiert Weg der Wahl Werte von zwei Vektoren ist. Diese bemerkenswerte Funktion hat drei Argumente:

  • Ein Testvektor mit logischen Werten

  • Ein Vektor mit Werten, die, wenn der entsprechende Wert in dem Testvektor zurückgegeben werden sollte, ist, WAHR

  • Ein Vektor mit Werten, die, wenn der entsprechende Wert in dem Testvektor zurückgegeben werden sollte, ist, FALSCH

Wie es funktioniert

Werfen Sie einen Blick auf das folgende Beispiel:

> Ifelse (c (1,3) lt; 2.5, 1: 2, 3: 4) [1] 1 4

Führen Sie über die Schritte, die die Funktion übernimmt:

  1. Der Bedingungsausdruck c (1,3) lt; 2.5 wird auf einen logischen Vektor ausgewertet.

  2. Der erste Wert dieses Vektors ist WAHR, weil 1 kleiner als 2,5 ist. So ist der erste Wert des Ergebnisses wird der erste Wert des zweiten Arguments, das gleich 1 ist.

  3. Der nächste Wert ist FALSCH, denn 3 größer als 2,5 ist. Daher, ansonsten() nimmt den zweiten Wert des dritten Arguments als der zweite Wert des Ergebnisses (die 4).

  4. Ein Vektor mit den ausgewählten Werten wird als Ergebnis zurückgegeben.

Probier es aus

Um zu sehen, wie dies im Beispiel der Werke Preiskalkulator () Funktion, versuchen Sie die Funktion in der Befehlszeile in der Konsole aus. Sagen Sie bitte zwei Kunden haben, und Sie arbeitete 25 und 110 Stunden für sie sind. Sie können den Nettopreis mit dem folgenden Code zu berechnen:

> my.hours lt; - c (25.110)> my.hours * 40 * ifelse (my.hours> 100, 0,9, 1) [1] 1000 3960

Denken Sie daran, die ansonsten() Funktion kann seine Argumente zu recyceln. Und das ist genau das, was sie hier tut. In dem vorhergehenden ansonsten() Funktionsaufruf, übersetzen Sie die logische Vektor durch den Ausdruck erstellt my.hours> 100 in einen Vektor der Zahlen 0,9 und 1 anstelle enthält WAHR und FALSCH, beziehungsweise.

Passen Sie die Funktion in R

Natürlich müssen Sie die Anpassung Preiskalkulator () Funktion in einer solchen Weise, dass Sie auch für das Argument Eingang einen Vektor mit Werten können Öffentlichkeit. Andernfalls würden Sie nicht in der Lage sein, die Preise für eine Mischung aus öffentlichen und privaten Kunden zu berechnen. Die letzte Funktion sieht wie folgt aus:

Preiskalkulator lt; - Funktion (Stunden, pph = 40, public) {net.price lt; - Stunden * pphnet.price lt; - net.price * ifelse (Stunden> 100, 0,9, 1) tot.price lt; - net.price * ifelse (public, 1.06, 1.12) Runde (Preis)}

Als Nächstes erstellen Sie einen Rahmen wenig Daten, um die Funktion zu testen. Beispielsweise:

> Kunden lt; - data.frame (+ Stunden = c (25, 110, 125, 40), + public = c (TRUE, TRUE, FALSE, FALSE) +)

Sie können diese Datenrahmen verwenden nun als Argumente für die Preiskalkulator () Funktion, wie folgt aus:

> Mit (Kunden, Preiskalkulator (Stunden, public = public)) [1] 1060 4198 5040 1792

Menü