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 2807.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 2807.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 2087.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.272727Entã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 280A 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