Como usar vetorização com if em r
Vetorização é um dos atributos definidores da língua R. R não seria R se não tem algum tipo de versão vectorized de uma if ... else
Conteúdo
O problema
o priceCalculator () função ainda não é muito econômico para usar. Se você tem 100 clientes, você vai ter que calcular o preço para cada cliente separadamente. Verifique por si mesmo o que acontece se você adicionar, por exemplo, três quantidades diferentes de horas como um argumento:
gt; priceCalculator (C (25110)) [1] 1060 4664Warning mensagem: Em se (hora gt; 100) net.price lt; - net.price * 0,9: a condição tem comprimento gt; 1 e será usada apenas o primeiro elemento
Não só R avisá-lo que algo suspeito está acontecendo, mas o resultado que obtém é simplesmente errado. Em vez de US $ 4.664, o segundo cliente deve ser cobrado apenas R $ 4.198:
gt; priceCalculator (110) [1] 4198
A mensagem de aviso deve dar-lhe uma boa idéia sobre o que hapened. A E se declaração pode lidar apenas com um único valor, mas a expressão horas gt; 100 retorna dois valores, como mostrado pelo código seguinte:
gt; C (25, 110) gt; 100 [1] TRUE FALSE
Escolher com base em um vetor lógico em R
A solução que você está procurando é a ifelse () função, que é uma forma vectorized de escolher valores de dois vetores. Esta função notável recebe três argumentos:
Um vector de teste com valores lógicos
Um vector com os valores que deveriam ser retornado se o valor correspondente no vector de teste é VERDADE
Um vector com os valores que deveriam ser retornado se o valor correspondente no vector de teste é FALSO
Video: (Corel Draw x7) Aula Rapida - Vetorização Automática
Como funciona
Dê uma olhada no seguinte exemplo:
gt; ifelse (c (1,3) lt; 2,5, 1: 2, 3: 4) [1] 1 4
Correr sobre os passos a função demora:
A expressão condicional c (1,3) lt; 2,5 é avaliada a um vetor lógico.
O primeiro valor deste vector é VERDADE, porque 1 é menor do que 2,5. Assim, o primeiro valor do resultado é o primeiro valor do segundo argumento, que é 1.
O próximo valor é FALSO, 3 porque é maior do que 2,5. Conseqüentemente, ifelse () leva o segundo valor do terceiro argumento (que é 4) como o segundo valor do resultado.
Um vector com os valores seleccionados é retornado como o resultado.
Experimente
Para ver como isso funciona no exemplo do priceCalculator () função, tente a função para fora na linha de comando no console. Digamos que você tenha dois clientes e você trabalhou 25 e 110 horas para eles, respectivamente. Você pode calcular o preço líquido com o seguinte código:
gt; my.hours lt; - c (25110) gt; my.hours * 40 * IfElse (my.hours gt; 100, 0,9, 1) [1] 1000 3960
Lembre o ifelse () função pode reciclar seus argumentos. E isso é exatamente o que ele faz aqui. No precedente ifelse () chamada de função, você traduzir o vector lógica criada pela expressão my.hours gt; 100 num vector contendo os números 0,9 e 1 em vez de VERDADE e FALSO, respectivamente.
Adaptar a função no R
Claro, você precisa se adaptar a priceCalculator () função de tal forma que você também pode inserir um vetor com os valores para o argumento público. Caso contrário, você não seria capaz de calcular os preços para uma mistura de clientes públicos e privados. A última função se parece com isso:
priceCalculator lt; - função (horas, pph = 40, pública) {net.price lt; - * horas pphnet.price lt; - * net.price IfElse (hora gt; 100, 0,9, 1) tot.price lt; - net.price * ifelse (, 1,06, 1,12 público) rodada (preço)}
Em seguida, criar um pequeno quadro de dados para testar a função. Por exemplo:
Video: Rastreando, vetorizando imagens no CorelDRAW X5
gt; clientes lt; - data.frame (+ horas = c (25, 110, 125, 40), + públicas (c = VERDADEIRO, VERDADEIRO, FALSO, FALSE) +)
Você pode usar este quadro de dados agora como argumentos para a priceCalculator () função, assim:
gt; com (clientes, priceCalculator (horas, public = público)) [1] 1060 4198 5040 1792