Saltar al contenido

Use la calculadora de campo QGIS: si el valor en una columna, entonces el valor en la nueva columna

Solución:

Puedes usar regexp_match función para encontrar la posición inicial de la palabra dentro de la cadena. Que con la condición de uso if puede probar si hay una cadena de caracteres (por ejemplo, posición inicial> 0) y establecer el valor para TRUE (tu valor) y FALSE (0).

Debe tener un aspecto como este:

if(regexp_match(taxa, 'Calluna_vulgaris')>0,1,0) +
if(regexp_match(taxa, 'Porpidia_crustulata')>0,2,0) +
if(regexp_match(taxa, 'Rhizocarpon reductum')>0,2,0) +
if(regexp_match(taxa, 'Micarea_erratica')>0,2,0)

ingrese la descripción de la imagen aquí

Tal vez haya una mejor solución de expresiones regulares, pero no soy tan regular ninja.

Creo que el método más sólido para usted implicará tener su lista de valores de especies en otra capa como un CSV o similar, en otras palabras, una tabla de búsqueda. Intentar hacer coincidir valores en expresiones será increíblemente ineficaz, difícil de editar y propenso a errores.

Debería ser fácil crear una tabla de este tipo en cualquier programa de hoja de cálculo, incluso en un editor de texto básico, y luego importarla a QGIS usando Agregar capa de texto delimitado. (Asegúrese de recortar los campos para que no entren espacios adicionales)

Una vez que tenga eso, puede usar la siguiente expresión (basada en la excelente sugerencia de @ csk de usar matrices) para devolver los valores requeridos y sumarlos. Si una o más especies no se pueden encontrar en la tabla de búsqueda, devolverá un NULL que debería pedirle al usuario que verifique los datos.


Esta es la tabla de búsqueda que configuré llamada taxa_csv en la lista de capas (tenga en cuenta el nombre).

ingrese la descripción de la imagen aquí

Esta es la expresión que utilicé en la calculadora de campo (tenga en cuenta que el nombre de la tabla de búsqueda está en expresión).

eval(replace(array_to_string(array_foreach(string_to_array("taxa",'#'),
to_real(attribute(get_feature('taxa_csv','taxon',@element),'value'))),',','NULL'),',','+'))

Resultado – nota NULLs para entradas donde las especies no están en la tabla de búsqueda.

ingrese la descripción de la imagen aquí


Algunas notas:

  • El nombre de la tabla de búsqueda (taxa_csv) y los nombres de las columnas correspondientes (taxon, value) en la expresión son distingue mayúsculas y minúsculas. Si cambia el nombre de la tabla de búsqueda y / o los nombres de las columnas, recuerde cambiar los nombres en consecuencia en esta expresión.
  • Incluso si sus valores de origen son todos texto (por ejemplo, CSV), la expresión lo convertirá a un formato numérico (to_real()). (Sin embargo, 1/3 no funcionará, sugiero convertir esto en un número decimal)
  • Si desea tratar especies no encontradas como 0 en vez de NULL reemplácelo en consecuencia en la expresión. Sin embargo, no recomiendo esto, ya que puede ser engañoso.
  • ¿Alguien sabe una buena manera de sumar todo en una matriz en QGIS Field Calc? Tuve que combinarlo convirtiéndolo de nuevo en una cadena y reemplazando las comas con signos más y luego evaluándolo con eval()

Otra forma sería utilizar el replace funciona repetidamente para reemplazar los nombres de las especies con sus valores correspondientes, reemplace los signos # con signos +, luego use eval para calcular la suma. P.ej,

eval(
 replace(
  replace(
   replace(
    replace(
     replace(
      replace(
       replace("Taxa",'Baeomyces_rufus', 1),
      'Calluna_vulgaris',1),
     'Porpidia_crustulata',2),
    'Rhizocarpon reductum',2),
   'Micarea_erratica', 2),
  'Hypnum_jutlandicum', 0.33333),
 '#','+'))

Sin embargo, es bastante engorroso.


Sospecho que hay una posible solución inteligente usando matrices, pero no la he resuelto del todo. Esto es lo que tengo hasta ahora:

  • Usar string_to_array("Taxa", '#') para convertir el campo “Taxa” en una matriz
  • Cree una matriz con todos los posibles nombres de especies y cree otra matriz con sus valores correspondientes en el mismo orden. Usando el ejemplo que dio, esas matrices se verían así:

    • All_Taxa: ('Calluna_vulgaris', 'Baeomyces_rufus', 'Porpidia_crustulata', 'Rhizocarpon_reductum', 'Micarea_erratica', 'Hypnum_jutlandicum')

    • All_Values: (1,1,2,2,2,0.3333)

  • Usar array_find en cada valor de la matriz “Taxa”, para encontrar su posición dentro de la matriz All_Taxa. Entonces usa array_get para recuperar los valores correspondientes de la matriz All_Values.

    • los array_filter La función podría ser útil: podría filtrar la matriz All_Values ​​en función de una expresión que logre lo anterior.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *