Cómo utilizar vectorización con sentencias if en r
Vectorización es uno de los atributos que definen el lenguaje R. R no sería de R si no tenía algún tipo de versión vectorizada de un if ... else
Conteúdo
El problema
los priceCalculator () función todavía no es muy económico. Si usted tiene 100 clientes, usted tendrá que calcular el precio de cada cliente por separado. Compruebe por sí mismo lo que sucede si se agrega, por ejemplo, tres cantidades diferentes de hora como un argumento:
> PriceCalculator (c (25110)) [1] 1060 mensaje 4664Warning: En caso de (horas> 100) net.price lt; - net.price * 0.9: la condición tiene longitud> 1 y sólo se utilizará el primer elemento
No sólo R que algo raro está pasando advertir, pero el resultado que se obtiene es simplemente erróneo. En lugar de $ 4.664, el segundo cliente debe cargar solamente $ 4.198:
> PriceCalculator (110) [1] 4,198
El mensaje de advertencia le debe dar una idea clara acerca de lo que hapened. Un si declaración puede tratar sólo con un único valor, pero la expresión horas> 100 devuelve dos valores, como se muestra por el siguiente código:
> C (25, 110)> 100 [1] VERDADERO FALSO
Elija basado en un vector lógico en R
La solución que estás buscando es la ifelse () función, que es una forma vectorizada de la elección de los valores a partir de dos vectores. Esta función notable toma tres argumentos:
Un vector de prueba con valores lógicos
Un vector con los valores que deben ser devuelto si el valor correspondiente en el vector de prueba es CIERTO
Un vector con los valores que deben ser devuelto si el valor correspondiente en el vector de prueba es FALSO
Cómo funciona
Echa un vistazo a el siguiente ejemplo:
> Ifelse (c (1,3) lt; 2.5, 1: 2, 3: 4) [1] 1 4
Ejecutar más de los pasos que la función de toma:
La expresión condicional c (1,3) lt; 2.5 se evalúa a un vector lógico.
El primer valor de este vector es CIERTO, porque 1 es menor que 2,5. Por lo tanto, el primer valor del resultado es el primer valor del segundo argumento, que es 1.
El siguiente valor es FALSO, porque 3 es mayor que 2,5. Por lo tanto, ifelse () toma el segundo valor de la tercera argumento (que es 4) como el segundo valor del resultado.
Un vector con los valores seleccionados se devuelve como resultado.
Inténtalo
Para ver cómo funciona esto en el ejemplo de la priceCalculator () función, pruebe la función a cabo en la línea de comandos en la consola. Digamos que tienes dos clientes y que trabajó 25 y 110 horas para ellos, respectivamente. Usted puede calcular el precio neto con el siguiente código:
> My.hours lt; - c (25,110)> my.hours * 40 * ifelse (my.hours> 100, 0,9, 1) [1] 1000 3960
Recuerde, el ifelse () función puede reciclar sus argumentos. Y eso es exactamente lo que hace aquí. En el precedente ifelse () llamada a la función, que traduce el vector lógico creado por la expresión my.hours> 100 en un vector que contiene los números 0,9 y 1 en lugar de CIERTO y FALSO, respectivamente.
Adaptar la función en R
Por supuesto, es necesario adaptar la priceCalculator () función de tal manera que también se puede introducir un vector con valores para el argumento público. De lo contrario, usted no sería capaz de calcular los precios de una mezcla de clientes públicos y privados. La función final es la siguiente:
priceCalculator lt; - la función (hora, ppc = 40, público) {net.price lt; - hora * pphnet.price lt; - net.price * IfElse (hora> 100, 0,9, 1) tot.price lt; - net.price * ifelse (, 1,06, 1,12 pública) y vuelta (precio)}
A continuación, cree un poco de trama de datos para probar la función. Por ejemplo:
> Clientes lt; - data.frame (+ horas = c (25, 110, 125, 40), + = públicos c (TRUE, TRUE, FALSE, FALSE) +)
Puede utilizar este cuadro de datos ahora como argumentos para la priceCalculator () función, así:
> Con (clientes, priceCalculator (hora, pública = público)) [1] 1060 4198 5040 1792