Sådan bruges vectorization med Hvis Erklæringer i R

Vectorization er et af de vigtigste egenskaber for R sprog. R wouldnâ € t være R, hvis det didnâ € t har en form for vektoriseret version af en hvis ... ellers redegørelse.

Problemet

The priceCalculator () funktion stadig ISNA € t meget økonomisk at bruge. Hvis du har 100 kunder, youâ € ll nødt til at beregne prisen for hver klient separat. Check for dig selv, hvad der sker, hvis du tilføjer for eksempel tre forskellige mængder af timer som et argument:

> PriceCalculator (c (25110))
[1] 1060 4664
Advarsel besked:
I hvis (timer> 100) net.price <- net.price * 0,9:
betingelsen har længde> 1, og kun det første element vil blive anvendt

Ikke alene R advare dig, at noget muggent der foregår, men det resultat, du får, er almindelig forkert. I stedet for $ 4664, skal den anden klient blive opkrævet kun $ 4198:

> PriceCalculator (110)
[1] 4198

Den advarsel bør give dig en rimelig idé om, hvad hapened. En if-sætning kun kan håndtere en enkelt værdi, men udtrykket timer> 100 returnerer to værdier, som det fremgår af følgende kode:

> C (25, 110)> 100
[1] FALSK SAND

Vælge til en logisk vektor i R

Løsningen youâ € re leder efter, er det ifelse () funktion, som er en vektoriseret måde at vælge værdier fra to vektorer. Denne bemærkelsesværdige funktion tager tre argumenter:

  • En test vektor med logiske værdier
  • En vektor med værdier, der skal returneres, hvis den tilsvarende værdi i testen vektoren er TRUE
  • En vektor med værdier, der skal returneres, hvis den tilsvarende værdi i testen vektoren er FALSE

Sådan virker det

Tag et kig på følgende eksempel:

> Ifelse (c (1,3) <2,5, 1: 2, 3: 4)
[1] 1 4

Løb over de skridt funktionen tager:

  1. Den betingede udtryk c (1,3) <2,5 evalueres til en logisk vektor.
  2. Den første værdi af denne vektor er sandt, fordi 1 er mindre end 2,5. Så den første værdi af resultatet er den første værdi af det andet argument, som er 1.
  3. Den næste værdi er falsk, fordi 3 er større end 2,5. Derfor ifelse () tager den anden værdi af det tredje argument (som er 4) som den anden værdi af resultatet.
  4. En vektor med de valgte værdier returneres som resultat.

Prøv det

For at se, hvordan det fungerer i eksemplet med priceCalculator () funktion, prøv funktionen ud på kommandolinjen i konsollen. Sig, at du har to kunder, og du har arbejdet 25 og 110 timer for dem, hhv. Du kan beregne den nettopris med følgende kode:

> My.hours <- c (25110)
> My.hours * 40 * ifelse (my.hours> 100, 0,9, 1)
[1] 1000 3960

Husk, det ifelse () funktionen kan genbruge sine argumenter. Og thatâ € s præcis, hvad den gør her. I den foregående ifelse () funktion opkald, du oversætter den logiske vektor skabt af udtrykket my.hours> 100 ind i en vektor indeholdende tallene 0,9 og 1 i stedet for sande og falske hhv.

Tilpas funktion i R

Selvfølgelig er du nødt til at tilpasse priceCalculator () funktionen på en sådan måde, at du også kan indtaste en vektor med værdier for offentligheden argumentet. Ellers wouldnâ du € t være i stand til at beregne priser for en blanding af offentlige og private kunder. Den endelige funktion ser sådan ud:

priceCalculator <- funktion (timer, PPH = 40, offentlig) {
net.price <- timer * PPH
net.price <- net.price * ifelse (timer> 100, 0,9, 1)
tot.price <- net.price * ifelse (offentlig, 1,06, 1,12)
runde (pris)
}

Derefter opretter lidt dataramme at teste funktionen. For eksempel:

> klienter <- data.frame (
+ time = C (25, 110, 125, 40),
+ Offentlige = c (SAND, SAND, FALSK, FALSK)
+)

Du kan bruge disse data frame nu som argumenter for priceCalculator () funktion, som denne:

> Med (klienter, priceCalculator (timer, offentlig = offentlig))
[1] 1060 4198 5040 1792


© 2023 Zajacperrone.com | Contact us: webmaster# zajacperrone.com