Convertir matriz en cadenaHola a todos,
Estoy tratando de obtener un valor de una matriz de otra tabla y usarlo como valor para mi selección. ¿Hay alguna manera 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);
Modelado Estadístico AvanzadoLa personalización en masaRe: Convertir matriz en cadenacraig,
Una vez más aprendí algo nuevo sobre JMP.Originalmente había escrito el código usando una función Contiene(), pero luego pasé a usar la función Loc(), porque pensé que sería un problema donde
Contains( "BARBARA ANN", "BARBARA")
devuelve un Verdadero.
Tuve (erróneamente resulta) que si el componente de comparación de Contiene es una Lista de elementos 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
Re: Convertir matriz en cadenaDe nuevo, asombrado por la habilidad 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_archivo_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. El < El mensaje obtiene todos los valores de la columna, incluidos los duplicados. El matriz asociativa función crea un conjunto de valores únicos, y el < El mensaje devuelve los valores únicos. (Bien hecho @29755 .)
¿y esto?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
El < El mensaje opera en cada fila del archivo_fusionado , uno a la vez y selecciona filas cuando el argumento es distinto de cero.
El ubicación() La función devuelve una matriz de índices. Busca la lista en nombre_clave para ocurrencias 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. El filas() La función devuelve 0 o 1, que luego se compara con > 0 y sigue siendo 0 o 1. Entonces, las filas se seleccionan si :Name_final está en la lista de ref_file_1:NAME.
Alternativa:
¿Qué pasaría si hubiera >1e6 nombres en name_key y >1e7 filas en merge_file? ¿Cómo sería la actuación? La función loc buscará mucho. Comparará cadenas 1e13. Te cansarás de esperar. La solución para eso es usar la matriz asociativa de esta manera:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Ahora solo hay 1e7 búsquedas en nameSet. No son gratuitos, pero son mucho más rápidos que verificar elementos 1e6 secuencialmente. Supongo que alrededor de 20 compara cada uno (log2 (1e6)). Esto también puede ser más fácil de seguir para el siguiente mantenedor.
(No probado. Correcciones bienvenidas!)
Re: 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);