1 votos

Iterar a través de un ráster en R y aplicar declaraciones condicionales

Tengo un conjunto de datos raster en R con valores numéricos que van de 0 a 61,5, e incluye algunos NAs aleatorios en todo el conjunto. Me gustaría proporcionar un conjunto de datos reproducible, pero no sé cómo crear un raster con NAs aleatorios y no puedo compartir mis datos reales en línea. Simplemente necesito iterar a través de cada valor del raster y aplicar la siguiente lógica:

> for (i in 1:length(raster){  
>  if (value(i) >= 5.1) {value(i) = 1}  
>  else if (value(i) < 5.1) {value(i) = value(i)/5.1}  
>  else (is.na(value(i)) == TRUE) {value(i) = 0.000001} 
> }

A menudo hago bucles en data frames en R pero soy nuevo en el formato raster y no puedo lograr que esto funcione. No estoy seguro de cómo acceder a cada valor del raster en un bucle for y aplicar mis declaraciones condicionales. Si algo no está claro, hágamelo saber en los comentarios y corregiré mi pregunta según sea necesario.

4voto

Jay Bazuzi Puntos 194

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.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X