Convertir matriz en cadenaHola todos,
Estoy tratando de obtener un valor de una matriz de otra tabla y usarlo como valor para mi selección. ¿Hay alguna forma de convertir la matriz en una cadena?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
Tabla de datosOtroScriptingRe: convertir matriz en cadenaCreo que esto te dará lo que quieres
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Re: convertir matriz en cadenaUna vez más, me sorprende la capacidad de Jim para llegar al meollo de la pregunta. Dos buenos fragmentos de código aquí merecen una explicación más larga:
¿Qué hace esto?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 es una referencia de tabla de datos, "NOMBRE" es el nombre de una columna como una cadena (literalmente, "NOMBRE", pero podría estar en una variable), y el columna La función devuelve una referencia de columna. La << obtener valores message obtiene todos los valores de la columna, incluidos los duplicados. La matriz asociativa La función crea un conjunto de valores únicos, y la << conseguir llaves mensaje devuelve los valores únicos. (Bien hecho @ jshvt17 .)
¿y esto?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
La << seleccione donde mensaje opera en cada fila del merged_file , uno a la vez y selecciona filas cuando el argumento es distinto de cero.
La loc () La función devuelve una matriz de índices. Busca en la lista nombre_clave para apariciones de: Name_final. La matriz resultante puede tener cero o más filas, aunque en este ejemplo tendrá 0 o 1 fila porque las claves son únicas. La nrows () La función devuelve 0 o 1 que luego se compara> 0 y permanece 0 o 1. Entonces, las filas se seleccionan si: Name_final está en la lista de ref_file_1: NAME.
Alternativa:
¿Qué pasa si hay> 1e6 nombres en name_key y> 1e7 filas en merge_file? ¿Cómo sería la actuación? La función loc buscará mucho. Compara 1e13 cadenas. Te cansarás de esperar. La solución para eso es usar la matriz asociativa como esta:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Ahora solo hay búsquedas 1e7 en nameSet. No son gratuitos, pero son mucho más rápidos que comprobar 1e6 elementos de forma secuencial. Supongo que unas 20 comparaciones cada una (log2 (1e6)). Esto también puede ser más fácil de seguir para el siguiente responsable de mantenimiento.
(Sin probar. ¡Correcciones bienvenidas!)
Re: convertir matriz en cadenaCraige,
Una vez más, aprendí algo nuevo sobre JMP.Originalmente había escrito el código usando una función Contains (), pero luego lo convertí para usar la función Loc (), porque lo que pensé sería un problema donde
Contains( "BARBARA ANN", "BARBARA")
devuelve True.
Tenía (resultó erróneamente) que si el componente de comparación de Contiene es una Lista de elementos de JMP,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
también devolvería un True, sin embargo, devuelve un False, lo que significa que hace una coincidencia absoluta.
Gracias por la gran información