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