Como usar Vectorization com instruções IF em R

Vectorização é um dos atributos definidores da linguagem 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 valores diferentes de horas como um argumento:

> PriceCalculator (c (25.110)) [1] 1060 4664Warning mensagem: Em if (horas> 100) net.price lt; - net.price * 0.9: a condição tem comprimento> 1 e será usado apenas o primeiro elemento

Não só R avisá-lo de que algo suspeito está acontecendo, mas o resultado que se obtém é simplesmente errado. Em vez de US $ 4.664, o segundo cliente deve ser cobrado apenas R $ 4.198:

> 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> 100 retorna dois valores, como mostra o seguinte código:

> C (25, 110)> 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 de vectorizado escolhendo valores a partir de dois vectores. 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

Como funciona

Dê uma olhada no exemplo a seguir:

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

Correr sobre os passos a função demora:

  1. A expressão condicional C (1,3) lt; 2.5 é avaliada a um vector lógico.

  2. O primeiro valor é deste vetor VERDADE, porque 1 é menor do que 2,5. Assim, o primeiro valor do resultado é o primeiro valor do segundo argumento, que é um.

  3. 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.

  4. Um vetor com os valores selecionados é 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:

> my.hours lt; - c (25,110)> my.hours * 40 * ifelse (my.hours> 100, 0,9, 1) [1] 1000 3960

Lembre-se, a 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> 100 a um vector que contém os números 0,9 e 1 em vez de VERDADE e FALSO, respectivamente.

Adaptar a função em 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úblico) {net.price lt; - horas * pphnet.price lt; - net.price * IfElse (horas> 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:

> clientes lt; - data.frame (+ horas = c (25, 110, 125, 40), + públicas = c (TRUE, TRUE, FALSE, FALSE) +)

Você pode usar este quadro de dados agora como argumentos para a priceCalculator () função, como este:

> Com (clientes, priceCalculator (horas, public = público)) [1] 1060 4198 5040 1792

menu