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

declaração.

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

    Publicações relacionadas