7.6 Substituição de elementos de um vetor
Podemos substituir os valores de um vetor usando os mesmos esquemas de indexação vistos na seção anterior. A sintaxe geral para substituir elementos de um vetor por novos valores é:
vetor[indices] <- novos_valores
Vamos fazer uma cópia do vetor prec
para então alterá-lo, fazendo substituição de seus elementos usando as diferentes formas de indexação.
(prec_alt <- prec)
#> jan fev mar abr mai jun jul ago set out nov dez
#> 300 200 210 12 0 0 12 22 100 120 10 280
7.6.0.1 Por posições
suponha que você precisa substituir os valores de precipitação dos meses de inverno por valores corrigidos.
inds_jja
#> [1] 6 7 8
prec_alt[inds_jja] <- c(NA, 21, 42)
prec
#> jan fev mar abr mai jun jul ago set out nov dez
#> 300 200 210 12 0 0 12 22 100 120 10 280
prec_alt
#> jan fev mar abr mai jun jul ago set out nov dez
#> 300 200 210 12 0 NA 21 42 100 120 10 280
7.6.0.2 Por nomes
Suponha que os valores de precipitação de janeiro e dezembro foram atualizados para 250 e 208, respectivamente. Esta alteração pode ser com o código abaixo.
prec_jd_corr <- c(250, 208)
prec_alt[c("jan", "dez")] <- prec_jd_corr
prec
#> jan fev mar abr mai jun jul ago set out nov dez
#> 300 200 210 12 0 0 12 22 100 120 10 280
prec_alt
#> jan fev mar abr mai jun jul ago set out nov dez
#> 250 200 210 12 0 NA 21 42 100 120 10 208
7.6.0.3 Por comparação
Imagine que você precisa substituir os valores de prec
que ficaram em torno de \(\pm10 \%\) da média mensal climatológica pelos valores climatológicos.
Vamos primeiro determinar os desvios relativos (em %) em relação as médias climatológicas:
# limiar em % da normal climatológica
limiar <- 10
desvios <- prec - prec_clim
# anomalias relativas em %
(anom_perc <- abs(desvios)/prec_clim * 100)
#> jan fev mar abr mai jun jul
#> 30.434783 2.439024 31.250000 88.000000 100.000000 100.000000 70.000000
#> ago set out nov dez
#> 63.333333 9.090909 27.272727 95.000000 27.272727
Então substituímos os casos com baixo desvio pela precipitação climatológica.
# meses com prec em torno de +-10% da média climatol.
prec[anom_perc <= 10]
#> fev set
#> 200 100
# substituição pela prec mensal climatol.
prec[anom_perc <= 10] <- prec_clim[anom_perc <= 10]
prec
#> jan fev mar abr mai jun jul ago set out nov dez
#> 300 205 210 12 0 0 12 22 110 120 10 280
A função abs()
determina o valor absoluto ou módulo de um vetor.
Uma alternativa bastante útil para substituir valores de um vetor usando comparações é a função vetorizada ifelse()
. A mesma operação realizada no trecho de código anterior poderia ser feita com ifelse()
da seguinte forma:
prec <- ifelse(ano_perc <= 10, prec_clim, prec)
prec
#> jan fev mar abr mai jun jul ago set out nov dez
#> 300 205 210 12 0 0 12 22 110 120 10 280