Asociar columnas por nombreTengo algo que hacer aquí
Resuelto: Trazar automáticamente las columnas asociadas - Comunidad de usuarios de JMP
Pero estoy bastante seguro de que es innecesariamente engorroso. Tengo nombres de columnas que terminan en H (Alto) y necesito asociarlos con nombres de columnas que, de lo contrario, coincidirían, pero que terminan en L (Bajo). Puedo crear una matriz asociativa con los nombres de columna sin el último carácter. ¿Qué debo hacer?
names default to here(1);
dt = Current Data Table();
colList = dt << get column names( string );
for each({col,index}, colList,
//colList[index] = substr(col,1,3)
colList[index] = Left(col,Length(col)-1)
);
grps = associative array(colList)<<GET keys=""></GET>
<P>Por ejemplo, VT123ABCH debe trazarse contra VT123ABCL y así sucesivamente.</P><LINGO-LABS id="lingo-labs-848773" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatización y scripting</LINGO-LABEL></LINGO-LABS>Re: Asociar columnas por nombre¿Siempre existen los pares? ¿Hay otras columnas en la tabla además de estos pares? ¿Están en un orden específico?
Editar:
Lo más probable es que se pueda mejorar mucho dependiendo del caso de uso real.
names default to here(1);
dt = New Table("",
New Column("VT123ABCH"),
New Column("VT123ABCL")
);
collist = dt << get column names(string);
hcols = Filter Each({colname}, colList,
Ends With(colname, "H");
);
aa = Associative Array();
For Each({hcolname}, hcols,
lcolname = Left(hcolname, Length(hcolname) - 1) || "L";
If(dt << Has Column(lcolname),
aa[hcolname] = lcolname
);
);
Show(aa);Re: Asociar columnas por nombreAquí tienes un ejemplo de cómo puedes hacer lo que quieres.

Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNames = dt << get column names( continuous, string );
For Each( {col}, colNames,
If( Ends With( col, "1" ) & Contains( colNames, Substr( col, 1, Length( col ) - 1 ) || "2" ),
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( X( As Column( col ) ), Y( As Column( Substr( col, 1, Length( col ) - 1 ) || "2" ) ) ),
Elements( Points( X, Y, Legend( 3 ) ), Smoother( X, Y, Legend( 4 ) ) )
);
)
);Re: Asociar columnas por nombreJarmo
Se ve mucho más ordenado que lo que tenía, sin embargo, me aparece este error.
"El objeto 'Tabla de datos' no reconoce el mensaje 'Tiene columna'"
Re: Asociar columnas por nombreEsto se agregó en JMP18

Puedes cambiarlo a Contiene() y debería funcionar bien la mayor parte del tiempo.
Contains(collist, lcolname)
Re: Asociar columnas por nombreJarmo
Esto está cerca, pero observo que hcolname está vacío, mientras que lcolname tiene un valor. ¿Necesito establecer hcolname como un objeto o una lista?
Re: Asociar columnas por nombrehcols debe contener una lista de todas las columnas que terminan en "H". Esto se usa en "For Each" y "each" si los elementos se van a usar uno por uno como hcolname. Puedes agregar impresiones de depuración para comprender qué sucede. Además, esta no es la única manera de hacerlo; por ejemplo, podrías hacerlo fácilmente en un solo bucle.
Re: Asociar columnas por nombre
Jarmo
Esto me acerca un poco más, pero lcolname no se completa hasta el valor final.
For Each({hcolname, index}, hcols,
{lcolname, index}, hcols = Left(hcolname, Length(hcolname) - 1) || "L";
If(dt << Contains(collist, lcolname),
aa[hcolname] = lcolname
);
);Re: Asociar columnas por nombreA mí me parece que funciona bien. Puedes cambiar la tabla de ejemplo a la capacidad de semiconductores y comprobar algunos números al final.
Names default to here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << get column names(string);
hcols = Filter Each({colname}, colList,
Ends With(colname, "1");
);
aa = Associative Array();
For Each({hcolname}, hcols,
lcolname = Left(hcolname, Length(hcolname) - 1) || "2";
If(dt << Has Column(lcolname),
aa[hcolname] = lcolname
);
);
Show(aa);
aa = ["ESM1" => "ESM2", "FST1" => "FST2", "INM1" => "INM2", "IVP1" => "IVP2", "NPN1" => "NPN2", "PBA1" => "PBA2", "PLG1" => "PLG2", "PLY1" => "PLY2", "PNP1" => "PNP2", "RES1" => "RES2", "RSP1" => "RSP2", "SIT1" => "SIT2", "VDP1" => "VDP2", "VPM1" => "VPM2"];
Pero también podrías tomar una ruta un poco diferente con un poco más de opciones de configuración.
Names Default To Here(1);
endchar1 = "1";
endchar2 = "2";
rgx_endchar1 = Eval Insert("(.+?)^endchar1^$");
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << get column names(string);
aa = Associative Array();
For Each({colname}, collist,
col_ptrn = Regex(colname, rgx_endchar1, "\1");
If(!IsMissing(col_ptrn), // ends with H
If(Contains(collist, col_ptrn || endchar2),
aa[col_ptrn || endchar1] = col_ptrn || endchar2;
);
);
);
show(aa);
Ambos me devuelven los mismos resultados.
Re: Asociar columnas por nombreJim
Excelente script y mucho más simple. Lo modifiqué un poco para que todos los gráficos se muestren en una ventana de "Compilación".
Names Default To Here( 1 );
dt = Current Data Table();
colNames = dt << get column names( continuous, string );
New Window( "Compilation",
For Each( {col}, colNames,
If(
Starts With( col, "VT" ) & Contains(
colNames,
Substr( col, 1, Length( col ) - 1 ) || "H"
),
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables(
X( As Column( col ) ),
Y( As Column( Substr( col, 1, Length( col ) - 1 ) || "L" ) )
),
Wrap( :LOT ),
Elements(
Points( X, Y, Legend( 1 ) ),
Line Of Fit( X, Y, Legend( 3 ) )
)
)
)
)
);Re: Asociar columnas por nombreJarmo
Rareza de JMP. El primero no funciona, el segundo sí. ¿JMP 17 quizás? Gracias por aguantarme.