obtener el nombre de la columna con valores de corte específicosHola,
Intento contar y obtener nombres de columnas específicos de estos ejemplos de datos (mis datos reales contenían 180 columnas y 20000 filas)
Quiero seleccionar la columna que corta > 1000
| No. | A*1:01 | A*2:01 | B*9:02 | C*10:01 | DR*56:01 | DP*07_G | Obtener nombre |
| 1 | 10.67 | 0 | 9520.23 | 15000.1 | 90,56 | 40,89 | B*9:02, C*10:01 |
| 2 | 0 | 0 | 0 | 0 | 0 | 9.56 | |
| 3 | 9040.3 | 345.3 | 345,9 | 999,9 | 345 | 10.5 | A*1:01 |
| 4 | 34.4 | 4566 | 45 | 7 | 0 | 0 | A*2:01 |
| 5 | 9190.2 | 13567 | 3456 | 6789 | 9088 | 0 | A*1:01,A*2:01,B*9:02,C*10:01,DR*56:01 |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | |
| ... | | | | | | | |
Intento el script anterior como este.
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "A*1:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "A*2:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "B*9:02", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "C*10:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "DR*56:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
//get wanted columns. Assumes that IMC columns start from column 1 and all IMC columns are one after another
colNames = dt << Get Column Names("String");
For(i = N Items(colNames), i > 3000 , i--,
);
//new column with IMC with value 1
dt << New Column( "Ag", Character,
<< Set Each Value(
rowValues = dt[Row(), 0][1::N Items(colNames)]; //get values of row as matrix
colIndex = Contains(rowValues, 1); //get index of
If(colIndex > 0, //handle
colNames[colIndex], //get column name with the index
""; //when no 1 found use ""
);
);
);¿Podrías corregir mis guiones? ¡Gracias!
Además, ¿puedo usar una matriz porque necesito generar la "nueva columna" de 180 columnas?
Mejor,
Combinación y limpieza de datosRe: obtener el nombre de la columna con valores de corte específicosAsí es como manejaría esto

names default to here(1);
dt = New Table( "Example",
Add Rows( 6 ),
New Column( "A*1:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[10.67, 0, 9040.2999999999993, 34.399999999999999, 9190.2000000000007, 0
]
)
),
New Column( "A*2:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 345.30000000000001, 4566, 13567, 0] )
),
New Column( "B*9:02",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [9520.2299999999996, 0, 345.89999999999998, 45, 3456, 0] )
),
New Column( "C*10:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [15000.1, 0, 999.89999999999998, 7, 6789, 0] )
),
New Column( "DR*56:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [90.560000000000002, 0, 345, 0, 9088, 0] )
),
New Column( "DP*07_G",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [40.890000000000001, 9.5600000000000005, 10.5, 0, 0, 0] )
)
);
dt << New Column( "Get Name",character);
colNames = dt << get column names( continuous,string );
For Each Row(
theList = {};
For Each( {col, i}, colNames,
If( As Column( col ) > 3000,
Insert Into( theList, col )
)
);
:Get Name = Concat Items( theList, "," );
);
Re: obtener el nombre de la columna con valores de corte específicosHola Jim,
Gracias por su ayuda. Sin embargo, tengo 180 columnas y 20000 filas en palabras diferentes y no puedo ponerlas todas en los siguientes scripts. ¿Podría por favor darme más sugerencias?
Gracias
Re: obtener el nombre de la columna con valores de corte específicosEsto podría ser lo suficientemente rápido
Names Default To Here(1);
// Create a sample data table
dt = New Table("Example",
Add Rows(20000),
invisible
);
colcount = 200;
For(i = 1, i <= colcount, i++,
newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
Random Normal() * 1000
));
dt << run formulas;
newcol << delete formula;
);
start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
wait(0);
end = Tick Seconds();
show(end - start);Re: obtener el nombre de la columna con valores de corte específicosHola jarmo,
Muchas gracias. Pero el resultado es "fin - inicio = 0.0333333333255723;" Esa no es la nueva mesa. ¿Podría proporcionar más soluciones? por favor muéstreme la siguiente tabla de datos en JMP.
Gracias
Re: obtener el nombre de la columna con valores de corte específicosMi script crea una nueva columna "getname" con los valores

Con sus datos, después de arreglar sus columnas en numéricas (y eliminar Sin columna)

Re: obtener el nombre de la columna con valores de corte específicosHola jarmo,
Gracias por su ayuda, pero para ser honesto, como se muestra en el siguiente archivo adjunto, no puedo ejecutar el script como lo hizo usted. cuando verifiqué el script (comando + 1) que se muestra a continuación. Gracias por su ayuda.
dt = New Table("Example",
Add Rows(20000),
invisible
);
colcount = 200;
For(i = 1, i <= colcount, i++,
newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
Random Normal() * 1000
));
dt << run formulas;
newcol << delete formula;
);
start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
wait(0);
end = Tick Seconds();
show(end - start);
/*:
end - start = 0.683333333348855;
Re: obtener el nombre de la columna con valores de corte específicosTendrá que abrir su tabla, arreglar las columnas y luego ejecutar la parte donde se crea la nueva columna.
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
colnames = Remove(dt << Get Column Names("String"), 1); // drop No column
// Fix data and modeling types
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
Le recomiendo encarecidamente que consulte la Guía de secuencias de comandos de la Ayuda de JMP.
Re: obtener el nombre de la columna con valores de corte específicosHola Jarmo, ¿tienes alguna idea para extraer los valores de esto que son mayores que el límite (si tengo 50 columnas) con cada nombre de columna (columna getname en un ejemplo)?
Re: obtener el nombre de la columna con valores de corte específicos¿Cómo desea extraerlos? ¿Mi solución no crea una nueva columna que tiene los nombres de columna como cadenas separadas por , y espacio?

¿Desea comprobar los valores por columna en lugar de por fila? ¿O algo más?
Editar:
Si solo quieres una lista de columnas diferentes, tendría que saber cómo filtrarla. Si solo quieres todas las columnas, elimina la función Remove()
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
colnames = dt << Get Column Names("String");
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
For(i = 1, i < 100, i++,
newcol = dt << New Column(Hex(i), Numeric, Nominal, Values(J(1, N Rows(dt), Random Normal()*1000)));
);
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;Re: obtener el nombre de la columna con valores de corte específicosAquí hay un método alternativo que puede ayudar con una gran cantidad de columnas.
Names Default To Here( 1 );
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp");
colnames = Remove( dt << Get Column Names( "String" ), 1 ); // drop No column
// Fix data and modeling types
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
dtStack = dt << Stack(
columns( colnames ),
Source Label Column( "ColName" ),
Stacked Data Column( "Value" ),
Output Table( "The Stack" )
);
dtStack << select where( :value <= 1000 );
dtStack << delete rows;
dtStack << delete columns( Value );
dtSplit = dtStack << Split(
Split By( :ColName ),
Split( :ColName ),
Group( :No ),
Output Table( "Split of The Stack by ColName" ),
Sort by Column Property
);
close( dtStack, nosave );
colnames = Remove( dtSplit << Get Column Names( "String" ), 1 );
dtSplit << Combine Columns(
delimiter( "," ),
columns( colnames ),
Column Name( "Get Name" )
);
dtSplit << delete columns( colnames );
dt << Update( With( dtSplit ), Match Columns( :No = :No ) );
Close( dtSplit, nosave );Re: obtener el nombre de la columna con valores de corte específicos
Muchas gracias, me gustaría aclarar esto. Tengo otra columna de interés como "alfabeto de interés" y quiero obtener el nombre y el valor de todas las columnas con valores > 1000 y que todas las columnas coincidan con el alfabeto de la columna de interés.
¡Gracias!
Re: obtener el nombre de la columna con valores de corte específicosGracias, Jim, pero no funciona. Por favor vea el archivo adjunto.
Re: obtener el nombre de la columna con valores de corte específicosLo más probable es que hacer algo como lo que sugirió Jim sea más rápido y fácil, pero puedes hacer algo como esto con el método que demostré.
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
Summarize(dt, alphs = By(:"Alphabet of interest"n));
aa = Associative Array(alphs, Repeat({{}}, N Items(alphs)));
collist = dt << Get Column Names("String");
For Each({colname}, collist,
alph = Word(1, colname, "*");
If(Contains(aa, alph),
Insert Into(aa[alph], colname);
Column(dt, colname) << Set Data Type("Numeric") << Modeling Type("Continuous");
);
);
str_template = "^col^ (^val^)";
newcol = dt << New Column("getname", Character, Nominal, Formula(
cols = aa[:"Alphabet of interest"n];
vals = dt[Row(), aa[:"Alphabet of interest"n]];
valid_idx = Loc(vals > 1000);
If(N Items(valid_idx) > 0,
res = {};
For Each({{col, val}}, Across(cols[valid_idx], vals[valid_idx]),
Insert Into(res, Eval Insert(str_template));
);
Concat Items(res, ", ");
,
""
);
));
dt << run formulas;
newcol << delete formula;
dt << show window(1);

Re: obtener el nombre de la columna con valores de corte específicosSi el script se escribió para ejecutarse con una columna llamada "No" seguida de columnas numéricas, la tabla de datos que proporcionó tiene dos columnas de caracteres además de la numérica. Si elimina las columnas "Alfabeto de interés" y "Obtener nombre y valor" y luego ejecuta el script, funciona bien.
Debería poder cambiar fácilmente el script para compensar las columnas adicionales. Elimínelas en el script antes de comenzar a recuperar los nombres de columnas o elimínelas de la lista de nombres de columnas antes de procesar For Each. Esto debería funcionar.
Re: obtener el nombre de la columna con valores de corte específicosMuchas gracias. Este script funciona. Sin embargo, lamento que mis datos originales fueran más complicados que esto. El alfabeto de interés tiene múltiples "alfabetos" y "números" separados con "," (A1, B9) como archivos adjuntos. ¿Cómo puedo obtener la columna de nombre y valor que correlaciona la columna del alfabeto de interés y el nombre de la columna?

Gracias por su ayuda.
Re: obtener el nombre de la columna con valores de corte específicos¿Cómo se determinan esos "alfabetos"? ¿Son todos los que están después del último "_"? Si ese es el caso, debería poder hacer una pequeña modificación a mi script y tomar la última palabra en lugar de la primera y usar un separador diferente, por lo que esta parte requiere una pequeña modificación.
alph = Word(1, colname, "*");
Re: obtener el nombre de la columna con valores de corte específicosGracias por tu sugerencia. Si quiero que coincida la primera palabra antes de : debería ser así
alph = Word(1, colname, ":");
y si quiero que coincida con la última palabra después de "_" debería ser esto
alph = Word(-1, colname, "_");
¿Qué sucede si necesito hacer coincidir antes de ":" y después de "_" simultáneamente? Después de unir los scripts que ejecuté para cada uno de los anteriores, no pude hacerlo con el duplicado (exactamente lo mismo).
Gracias
Re: obtener el nombre de la columna con valores de corte específicosAl observar su tabla, el inicio y el final serán diferentes (inicio A*1 y final A1), por lo que tendrá que agregar esas claves "adicionales" a la matriz asociativa para realizar la comparación Y manejar los duplicados más tarde.
Re: obtener el nombre de la columna con valores de corte específicosAdemás, si una columna del alfabeto de interés tenía más de 1, el script no se ejecutaba. ¿Tienes alguna sugerencia al respecto?
¡Gracias!
Re: obtener el nombre de la columna con valores de corte específicosMi guión abordaba las situaciones que me indicaste. Según la pregunta real, es posible que sea necesario volver a escribir el guión por completo o hacer algunas modificaciones menores.
Re: obtener el nombre de la columna con valores de corte específicosGracias Jarmo, me gustaría adjuntar el archivo que sea compatible con lo que quiero hacer aquí. Quiero hacer coincidir la columna Alphabet que se compone de DOA y DO con cada columna de DOA1*0x:0x,DOB1*0x:0x_DOx. DOA0x coincide con DOA1*0x (no incluye después de ":") y DOx o DOB1*Ox coincide con DOx. Todos ellos deben tener un valor de más de 1000 para que se muestren en la columna de resultados. No puedo corregir la fórmula existente como dijiste. ¡Gracias de antemano!
Re: obtener el nombre de la columna con valores de corte específicos¿Por qué DOA1*0x no coincidiría con DOx?
Re: obtener el nombre de la columna con valores de corte específicosAquí hay una especie de script, todavía tengo que adivinar las reglas correctas, así que no tengo idea de si hace lo que se supone que debe hacer.
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_edit.jmp");
// fix data
For Each({colname}, dt << Get Column Names("Character", "String"),
If(colname == "Alphabet",
break();
);
Column(dt, colname) << Set Data Type("Numeric") << Set Modeling Type("Continuous");
);
dt << Delete Columns("get name and value");
dt << New Column("R", Numeric, Ordinal, Formula(Row()));
dt_stacked = dt << Stack(
columns(
:"DOA1*01:01,DOB1*01:01_DO1"n, :"DOA1*02:01,DOB1*01:01_DO1"n,
:"DOA1*03:01,DOB1*01:01_DO1"n, :"DOA1*02:01,DOB1*02:01_DO2"n,
:"DOA1*01:05,DOB1*02:01_DO2"n, :"DOA1*04:03,DOB1*03:01_DO3"n,
:"DOA1*06:01,DOB1*04:01_DO4"n, :"DOA1*05:01,DOB1*03:01_DO7"n
),
Source Label Column("Label"),
Stacked Data Column("Data"),
Output Table("stacked")
);
rows_to_delete = dt_stacked << Get Rows Where(:Data <= 1000);
dt_stacked << Delete Rows(rows_to_delete);
dt_stacked << New Column("Match", Numeric, Nominal);
For Each Row(dt_stacked,
alphs = Words(:Alphabet, ",");
temp_label = Regex(:Label, "(\d\*)", "", GLOBALREPLACE);
retval = 0;
For Each({alph}, alphs,
If(Contains(temp_label, alph),
retval = 1;
break();
);
);
:Match = retval;
);
rows_to_delete = dt_stacked << Get Rows Where(:Match == 0);
dt_stacked << Delete Rows(rows_to_delete);
dt_stacked << New Column("NewStr", Character, Nominal, Formula(
:Label || " (" || Char(:Data) || ")"
));
Summarize(dt_stacked, rs = By(:R));
fixed_rs = Transform Each({r}, rs, Num(r));
vals = Associative Array();
For Each({r}, fixed_rs,
t = dt_stacked << Get Rows Where(:R == r);
vals[r] = Concat Items(dt_stacked[t, "NewStr"], ",");
);
Close(dt_ stacked);
new_col = dt << New Column("Res", Character, Nominal, Formula(
If(Contains(vals, :R),
vals[:R]
,
""
);
));
dt << run formulas;
new_col << Delete Formula;
Re: obtener el nombre de la columna con valores de corte específicosNo tiene comparación con la biología.
Re: obtener el nombre de la columna con valores de corte específicosGracias, Jarmo. ¡Es un trabajo!