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)
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).
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 NULL
s para entradas donde las especies no están en la tabla de búsqueda.
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 deNULL
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 usaarray_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.
- los