Si puedes hacer esto en un vector, puedes hacerlo en un raster.
Para hacer esto en un vector, primero configura un vector de prueba para ver si funciona.
x = c(0, 1, 2, 3, NA, 5, 5.1, NA, 6, 7)
si entiendo la primera parte, todo lo >= 5.1 se convierte en 1, todo lo menor se escala por 5.1. Eso es esto:
ifelse(x>=5.1, 1, x/5.1)
que luce así:
[1] 0.0000000 0.1960784 0.3921569 0.5882353 NA 0.9803922 1.0000000
[8] NA 1.0000000 1.0000000
y ahora usamos ifelse
en los NAs para establecerlos en 0.000001:
> ifelse(is.na(x),.000001, ifelse(x>=5.1, 1, x/5.1))
[1] 0.0000000 0.1960784 0.3921569 0.5882353 0.0000010 0.9803922 1.0000000
[8] 0.0000010 1.0000000 1.0000000
un poco difícil decir cómo se ha mapeado todo, así que combinémoslo con el original:
> cbind(x, ifelse(is.na(x),.000001, ifelse(x>=5.1, 1, x/5.1)))
x
[1,] 0.0 0.0000000
[2,] 1.0 0.1960784
[3,] 2.0 0.3921569
[4,] 3.0 0.5882353
[5,] NA 0.0000010
[6,] 5.0 0.9803922
[7,] 5.1 1.0000000
[8,] NA 0.0000010
[9,] 6.0 1.0000000
[10,] 7.0 1.0000000
todo luce bien.
Para trabajar esto en un raster, puedes tratar r[]
como el vector de valores en el raster. Hagamos un ejemplo de x
:
> r = raster(matrix(x, ncol=2))
entonces es un raster de 2x5:
> as.matrix(r)
[,1] [,2]
[1,] 0 5.0
[2,] 1 5.1
[3,] 2 NA
[4,] 3 6.0
[5,] NA 7.0
luego usa r[]
en todas partes donde teníamos x
y reemplaza los valores en r
:
> r[] = ifelse(is.na(r[]),.000001, ifelse(r[]>=5.1, 1, r[]/5.1))
dando:
> as.matrix(r)
[,1] [,2]
[1,] 0.0000000 0.9803922
[2,] 0.1960784 1.0000000
[3,] 0.3921569 0.0000010
[4,] 0.5882353 1.0000000
[5,] 0.0000010 1.0000000
Resultados del aprendizaje: R puede trabajar en vectores enteros y es mucho más rápido cuando haces eso en lugar de usar ciclos for
; puedes crear un ejemplo reproducible aunque no puedas proporcionar los datos; haz ejemplos pequeños para poder verificar visualmente que tu código funcione; los rasters son vectores: si puedes hacer algo en un vector en R, puedes hacerlo en un raster.