Usar função com condicional

Bom dia, Caros

Estou tentando criar uma coluna adicional a partir de uma condicional (IF, IF else) utilizado dentro de uma função criada.
Entretanto, quando tento gerar uma coluna adicional a resposta (print) da primeira linha é copiado para todas as linhas da nova coluna.
Alguém consegue me dar uma força, sou iniciante e estou tentanto resolver esse problema que acredito que vai me auxíliar no entendimento de funções e de condicionais.

Exemplo do script:
library (tidyverse)

criando a função para cálculos de pontuação

pontos_mandante ← function(gols_mandante, gols_visitante) {

if (gols_mandante > gols_visitante){
print(3)
} else if(gols_mandante < gols_visitante){
print(0)
} else {print(1)
}
}

pontos_mandante()

criando a coluna pontuação no dataframe

pontos_t ← tibble::tibble(
mandantes_placar = c(3,2,3,4,5,6,9),
visitante_placar = c(2,3,4,5,6,7,8)
)
pontos_t %>%
mutate(pontos = pontos_mandante(mandantes_placar,visitante_placar))

Saída no console:
[1] 3

A tibble: 7 x 3

mandantes_placar visitante_placar pontos

1 3 2 3
2 2 3 3
3 3 4 3
4 4 5 3
5 5 6 3
6 6 7 3
7 9 8 3
Warning message:
Problem while computing pontos = pontos_mandante(mandantes_placar, visitante_placar).
i the condition has length > 1 and only the first element
will be used

Aguardo sugestões

Abraço.

Alexandre,

O problema está no fato de que a sua função só consegue processar 1 jogo por vez, mas você está tentando processar todos juntos. Note o erro: the condition has length > 1 and only the first element will be used. Veja que todas as pontuações são iguais à pontuação do primeiro jogo (já que só o primeiro elemento foi utilizado).

Uma coisa que você pode fazer, sem modificar muito o seu código, é colocar um loop dentro da função pontos_mandante(), assim ela retorna um valor para cada par de placares. Observação importante: não se usa a função print() para retornar o resultado de uma função, o correto é usar return(); é por causa disso que no seu console aparece um número 3 solto.

library(tidyverse)

# Calcular quantos pontos o time mandante recebeu
pontos_mandante <- function(gols_mandante, gols_visitante) {

  # Vetor vazio que vai receber os pontos de cada placar
  vetor_resultados <- c()

  # Para cada placar...
  for (i in seq_along(gols_mandante)) {

    # Aumentar o vetor de resultados com a pontuação do placar atual
    if (gols_mandante[i] > gols_visitante[i]) {
      vetor_resultados <- append(vetor_resultados, 3)
    } else if (gols_mandante[i] < gols_visitante[i]) {
      vetor_resultados <- append(vetor_resultados, 0)
    } else {
      vetor_resultados <- append(vetor_resultados, 1)
    }
  }

  # Retornar
  return(vetor_resultados)
}

# Tabela exemplo
pontos_t  <- tibble::tibble(
  mandantes_placar = c(3, 2, 3, 4, 5, 6, 9),
  visitante_placar = c(2, 3, 4, 5, 6, 7, 8)
)

# Criar uma coluna com os pontos do time mandante
pontos_t %>%
  mutate(pontos = pontos_mandante(mandantes_placar, visitante_placar))
#> # A tibble: 7 × 3
#>   mandantes_placar visitante_placar pontos
#>              <dbl>            <dbl>  <dbl>
#> 1                3                2      3
#> 2                2                3      0
#> 3                3                4      0
#> 4                4                5      0
#> 5                5                6      0
#> 6                6                7      0
#> 7                9                8      3

Created on 2022-03-04 by the reprex package (v2.0.1)

P.S.: Para ajudar na formatação do seu código, procure ler as instruções sobre como escrever uma boa pergunta: Como escrever uma boa pergunta.

1 curtida

Boa tarde, Clente

Muito obrigado, vou seguir suas dicas e aperfeiçoar o código.

Abraço

1 curtida