Comment utiliser la vectorisation avec des instructions if dans r

La vectorisation est l'un des attributs qui définissent la langue de R. R R ne serait pas si elle n'a pas eu une sorte de version vectorielle d'un sinon

Sommaire

  • Le problème
  • Choisissez basé sur un vecteur logique dans r
déclaration.

Le problème

La priceCalculator () fonction est pas encore très économique à l'usage. Si vous avez 100 clients, vous aurez à calculer le prix pour chaque client séparément. Vérifiez par vous-même ce qui se passe si vous ajoutez, par exemple, trois montants différents d'heures comme argument:

> PriceCalculator (c (25110)) [1] 1060 un message 4664Warning: Dans le cas (heures> 100) net.price lt; - * 0,9 net.price: la condition a une longueur> 1 et que le premier élément est utilisé

Non seulement R vous que quelque chose de louche se passait en garde, mais le résultat que vous obtenez est simplement faux. Au lieu de 4664 $, le deuxième client doit être chargée seulement 4198 $:

> PriceCalculator (110) [1] 4198

Le message d'avertissement devrait vous donner une idée juste de ce que hapened. Un si déclaration ne peut traiter qu'avec une seule valeur, mais l'expression heures> 100 renvoie deux valeurs, comme indiqué par le code suivant:

> C (25, 110)> 100 [1] VRAI FAUX

Choisissez basé sur un vecteur logique dans R

La solution que vous cherchez est le sinon() fonction, qui est une manière de choisir les valeurs vectorisé à partir de deux vecteurs. Cette fonction remarquable prend trois arguments:




  • Un vecteur de test avec des valeurs logiques

  • Un vecteur avec les valeurs qui devraient être renvoyée si la valeur correspondante dans le vecteur de test est VRAI

  • Un vecteur avec les valeurs qui devraient être renvoyée si la valeur correspondante dans le vecteur de test est FAUX

Comment ça marche

Jetez un oeil à l'exemple suivant:

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

Courir sur les étapes de la fonction prend:

  1. L'expression conditionnelle c (1,3) lt; 2.5 est évalué à un vecteur logique.

  2. La première valeur de ce vecteur est VRAI, parce que 1 est plus petit que 2,5. Ainsi, la première valeur du résultat est la première valeur du second paramètre, qui est une.

  3. La valeur suivante est FAUX, parce que 3 est plus grand que 2,5. Par conséquent, sinon() prend la deuxième valeur du troisième paramètre (qui est 4) en tant que seconde valeur de résultat.

  4. Un vecteur avec les valeurs sélectionnées est renvoyé comme résultat.

Essaye le

Pour voir comment cela fonctionne dans l'exemple de la priceCalculator () fonction, essayez la fonction sur la ligne de commande dans la console. Disons que vous avez deux clients et vous avez travaillé 25 110 heures et pour eux, respectivement. Vous pouvez calculer le prix net avec le code suivant:

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

Rappelez-vous, sinon() fonction peut recycler ses arguments. Et voilà exactement ce qu'il fait ici. Dans ce qui précède sinon() appel de fonction, vous traduire le vecteur logique créée par l'expression my.hours> 100 dans un vecteur contenant les numéros 0,9 et 1 à la place de VRAI et FAUX, respectivement.

Adapter la fonction dans R

Bien sûr, vous avez besoin d'adapter la priceCalculator () fonction de telle manière que vous pouvez également entrer un vecteur avec des valeurs pour l'argument public. Sinon, vous ne seriez pas en mesure de calculer les prix pour un mélange de clients publics et privés. La dernière fonction ressemble à ceci:

priceCalculator lt; - fonction (heures, PPH = 40, public) {net.price lt; - heures * pphnet.price lt; - net.price * IfElse (> 100 heures, 0,9, 1) tot.price lt; - net.price * ifelse (, 1,06, 1,12 public) ronde (prix)}

Ensuite, créer un petit cadre de données pour tester la fonction. Par example:

> Clients lt; - data.frame (+ heures = c (25, 110, 125, 40), + c = publics (TRUE, TRUE, FALSE, FALSE) +)

Vous pouvez utiliser cette trame de données maintenant comme arguments pour le priceCalculator () fonction, comme ceci:

> (Avec les clients, priceCalculator (heures, du public = public)) [1] 1060 4198 5040 1 792

» » » » Comment utiliser la vectorisation avec des instructions if dans r