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:
- Den betingede udtryk c (1,3) <2,5 evalueres til en logisk vektor.
- 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.
- 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.
- 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