Percursos
/
R
R
/
Exercícios
/
Observador de aves
Observador de aves

Observador de aves

Exercício de aprendizagem

Introdução

Este é um conceito importante em R. Para ajudar a compreender o que é possível, pode ser útil pensar na dimensionalidade das entradas e das saídas das várias funções.

Vetor à entrada, escalar à saída

Já vimos funções que recebem um vetor e devolvem um único valor, do tipo escalar:

> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15

Muitas funções estatísticas também pertencem a esta categoria, como mean().

Para vetores lógicos, existem all() e any().

Vetor à entrada, vetor à saída

Muitas funções em R atuam sobre o vetor completo, produzindo muitas vezes uma saída também vetorial. É o caso da maioria das funções matemáticas:

> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5

Isto não é apenas conciso e prático: evita a necessidade de ciclos, de compreensões de listas ou de recursão, que são comuns noutras linguagens. Em R, as funções vetoriais são muitas vezes muito mais rápidas do que essas técnicas.

Para ordenar um vetor, existe sort(), que devolve os valores, e order(), que devolve os índices:

> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am"    "I"     "in"    "not"   "order"
> order(v)
#> [1] 2 1 4 3 5

Por omissão, a ordenação é feita por ordem crescente. Especifica decreasing = TRUE se for necessário, ou usa rev() para inverter um vetor existente.

v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not"   "in"    "I"     "am"

rev(1:4)
#> [1] 4 3 2 1

Existem também funções que produzem saídas vetoriais cumulativas, percorrendo o vetor de entrada da esquerda para a direita:

> cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
> cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

Vários vetores à entrada, vetor à saída

Uma extensão deste conceito também pode ser usada para comparar vetores. Por exemplo, considera a função pmax(), que devolve o máximo de cada comparação par a par:

> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

Instruções

És um observador de aves entusiasta que acompanha quantas aves visitaram o teu jardim nos últimos sete dias.

Tens seis tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.

1. Verifica quantas aves visitaram hoje

Implementa a função today() para devolver quantas aves visitaram o teu jardim hoje. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1

2. Incrementa a contagem de hoje

Implementa a função increment_todays_count() para incrementar a contagem de hoje:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)

3. Verifica se houve algum dia sem aves a visitar

Implementa a função has_day_without_birds() que devolve TRUE se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve FALSE:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true

4. Calcula o número de aves que visitaram nos primeiros dias

Implementa a função count_for_first_days() que devolve o número de aves que visitaram o teu jardim desde o início da semana, mas limita a contagem ao número de dias indicado a partir do início da semana.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14

5. Calcula o número de dias movimentados

Há dias mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim. Implementa a função busy_days() para devolver o número de dias movimentados:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2

6. Calcula o total acumulado de visitas de aves na última semana

Tens curiosidade em saber quantas aves, no total, já visitaram o jardim esta semana. Calcula os totais acumulados para cada dia.

running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1]  7 13 18 22 25 27 28

7. Ordena os nomes dos dias conforme a sua movimentação

Suspeitas que as visitas das aves são afetadas pelos padrões de trânsito nas estradas próximas, sendo diferentes aos fins de semana e durante a semana.

Ordena as abreviaturas dos dias por ordem descendente do número de aves que visitaram o jardim.

day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Editar via GitHub A ligação abre numa nova janela ou separador
R Exercism

Estás pronto para começar Observador de aves?

Inscreve-te no Exercism para aprenderes e dominares R com 21 conceitos111 exercícios, e mentoria humana real, tudo grátis.