Selección de valor y copia en nuevas columnas.Ey,
Estoy tratando de automatizar un (aparentemente bastante fácil) selección de valores, creación de columnas y copiar/pegar proceso, sin embargo, no puedo encontrar la compilación de secuencias de comandos adecuada para él.
1) necesito crear 3 nuevas columnas agregar una selección diferente de valores de uno columna de la misma fuente a cada una de esas 3 nuevas columnas y crear una subconjunto de cada selección cuando todas las columnas están llenas .
2) El nombre de los subconjuntos debe corresponder al encabezado del archivo fuente original más un nuevo apéndice.
Tenga en cuenta:
La ubicación de las columnas y la cantidad de filas varía en los archivos de datos que tengo, sin embargo, los nombres son todos iguales.
Probé estos dos scripts que, por supuesto, no son correctos, pero no sé qué cambiar exactamente para que funcione. ¿Alguna sugerencia?
Versión 1:
Names Default To Here( 1 );
dt = Current Data Table();
//Select values to copy into new column
vals 1 = Select Where (:p-value (two-sided test)2 <= 0,09); //it seems that the "2" in the column name is confusing, but unfortunately, it would take a long time to go through all tables and change the column name
// Put these in a new column 1
dt = NewColumn("sign_0,09", Numeric, Continuous, Values(vals1));
Wait( 5 );
//Column 2
vals 2 = Select Where (:p-value (two-sided test)2 <= 0,05);
dt<<GET selected="" rows="" dt="NewColumn("sign_0,05"," numeric=""></GET>
Versión 2:
Names Default To Here( 1 );
dt = Current Data Table();
dt << :p-value (two-sided test)2 = [1,?]; //the end row varies and must be found automatically
results << New Column("sign_0,09", Numerical, Continuous);
For( i = 1, i <= NItems( "p-value (two-sided test)2"), i++,
results << Select Where (:p-value (two-sided test)2 <= 0,09) );
selRows = results << getSelectedRows;
AsColumn( results, "sign_0,09" )[selRows] = "p-value (two-sided test)2"[i];
//same process for 2 other new columns
dt<<SUBSET dt=""><< Select where :sign_0,09 != "";
dt<< Get selected rows
//the new name should be automatically given, too, is that possible?
dt << Subset( Output Table( "name as in original file plus _0,09 at the end" ), Selected Rows( 1 ), selected columns( 0 ) );
//same process for other 2 columns</SUBSET>
Estaría muy feliz de encontrar una solución, ya que en los hilos hasta ahora a menudo hay una copia/pegado en nuevas tablas de datos, sin embargo, "nunca" en una nueva columna, y parece que en su mayoría está relacionado con una selección de cadenas. No estoy seguro si la selección funciona igual para datos numéricos.
¡Gracias por cualquier ayuda!
Re: Seleccionar valor y copiar en nuevas columnasOye, aquí está la versión completa sin las funciones Mostrar, ya que en mi caso no me sirvieron de nada.
¡Gracias por tu ayuda!
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09);
//do not change "." to "," as the programme uses "." for background calculation
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.05);
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.01);
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Re: Seleccionar valor y copiar en nuevas columnasOye, aquí está la versión completa sin las funciones Mostrar, ya que en mi caso no me sirvieron de nada.
¡Gracias por tu ayuda!
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09);
//do not change "." to "," as the programme uses "." for background calculation
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.05);
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.01);
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Re: Seleccionar valor y copiar en nuevas columnas@Jeff_Perkinson
gracias jeff
Había leído tu mensaje demasiado tarde. Acabo de agregar la parte de creación de subconjuntos a la selección que propuso y, aparte de la creación automática de nombres, funciona perfectamente. Gracias por la sugerencia.
dt = Current Data Table();
dt << New Column( "sign_0,09",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0,05",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.05,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0,01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.01,
:Name( "p-value (two-sided test) 2" )
)
)
);
/* Step 3 */
// We already have the rows that meet the conditions
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */ Re: Seleccionar valor y copiar en nuevas columnasRe: Seleccionar valor y copiar en nuevas columnas@uday_guntupalli
Ejecuté el script con mis datos (tu versión y con el intercambio de la sugerencia de @Mark_Bailey ) y funciona para crear las columnas y obtener los datos seleccionados en la nueva columna.
Sin embargo, la última parte (ver más abajo) para mostrar las filas seleccionadas no funciona. Lo ajusté con Seleccionar dónde y Crear subconjunto.
/* Step 3 */
// We already have the rows that meet the conditions
Show(SR1);
Show(SR2);
Show(SR3);
/* End of Step 3 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Re: Seleccionar valor y copiar en nuevas columnasGracias por publicar más detalles, eso ayuda un poco.En lugar de intentar crear las nuevas columnas y llenarlas con valores a través de JSL, simplemente crearía tres nuevas columnas basadas en fórmulas con la fórmula:
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)

dt = Open( "seas_ratio_1_monthly.jmp" );
dt << New Column( "sign_0.09",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0.05",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.05,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0.01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.01,
:Name( "p-value (two-sided test) 2" )
)
)
);
Pero debo admitir que todavía no estoy seguro de cuál es el valor de las tablas de datos con solo las filas que son significativas a un nivel particular. ¿Cómo vas a usar esas tablas? ¿Necesitan las tres columnas indicadoras de importancia (es decir, sign_0,09; sign_0,05 y sign_0,01)? De lo contrario, puede evitar crear esas columnas todas juntas y simplemente subdividir las filas que son menores que cada nivel. ¿Puede contarnos más sobre su objetivo final y por qué desea tablas de datos como las que describe? Es posible que podamos proporcionar métodos aún más fáciles.
Re: Seleccionar valor y copiar en nuevas columnasVeo este enfoque, pero hay una forma más sencilla que implica cambiar el estado de la fila seleccionada. En lugar de esto:
SR1 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.09) << Get Selected Rows; <BR />// You can edit this to conform to european convention of 0,09
dt << Clear Select;
Puedes usar esto:
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09)
// You can edit this to conform to european convention of 0,09
De esta forma, no alterará la selección de la fila actual.
Re: Seleccionar valor y copiar en nuevas columnasEso se ve genial. Lo probaré lo antes posible.
Si se refiere a elementos comunes dentro de las 3 nuevas columnas, ¡este es solo el caso con respecto a los valores seleccionados que se agregarán a cada una de las columnas!
Por ejemplo, la selección de valores <= 0,01 también aparecerá en las columnas con 0,05 y 0,09 y los <= 0,05 aparecerán también en 0,09.
Simplificado:
un = [ 0,01 , 0,05 ,0,09]
B = [ 0,01 , 0,05 ]
C = [ 0,01 ]
Sin embargo, NO habrá ningún otro patrón o tipo de estructura "cada segunda fila es igual en las tres filas".
Por lo tanto, sí, tal vez haya una manera de trabajar con matrices y hacer que todo el proceso sea más fluido.
A <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">4</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">5</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">6</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
B <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
C <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">5</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
Re: Seleccionar valor y copiar en nuevas columnas@pacco ,
Ok, esto debería llevarte al 90% del camino.
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.09) << Get Selected Rows; // You can edit this to conform to european convention of 0,09
dt << Clear Select;
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.05) << Get Selected Rows; // You can edit this to conform to european convention of 0,05
dt << Clear Select;
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.01) << Get Selected Rows; // You can edit this to conform to european convention of 0,01
dt << Clear Select;
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
// We already have the rows that meet the conditions
Show(SR1);
Show(SR2);
Show(SR3);
/* End of Step 3 */ <BR />@Jeff_Perkinson ,
¿Hay una manera fácil de encontrar elementos comunes entre matrices? Tal vez Design() podría ayudar, pero ¿puede dar un ejemplo?
A = [1,2,3,4,5,6];
B = [1,2,3];
C = [3,5];
// The common element would be 3
Sé que podría usar matrices asociativas y la funcionalidad de intersección, pero las matrices no deberían tener una manera fácil de determinar elementos comunes/poco comunes.
Re: Seleccionar valor y copiar en nuevas columnasHola Jeff,
Gracias por echar un vistazo, también.
¡Adjunté los archivos en mi respuesta anterior! Espero que aclaren mi pregunta.
Re: Seleccionar valor y copiar en nuevas columnasRe: Seleccionar valor y copiar en nuevas columnasEy,
Muchas gracias por la entrada. Esto ya es muy útil saberlo.
Lo siento por la copia incorrecta del guión. Lo tendré en cuenta para la próxima.
Para que quede más claro lo que estoy tratando de hacer, adjunto una descripción general paso a paso de cómo debería ser el resultado. Espero que la guía de más claridad.
También adjunto el ejemplo en formato jmp.
¡Gracias por la ayuda!
Re: Seleccionar valor y copiar en nuevas columnasHe leído su descripción de lo que está tratando de hacer, pero tengo dificultades para entenderlo sin un ejemplo concreto. Además, dado que su JSL no está haciendo lo que le gustaría que hiciera, es difícil usarlo para adivinar cómo ayudarlo.
¿Podría publicar más detalles sobre lo que está tratando de hacer exactamente, preferiblemente con capturas de pantalla de las tablas de datos en cuestión y con qué le gustaría terminar? Creo que eso nos ayudaría en la Comunidad a ayudarte más directamente.
Gracias.
Re: Seleccionar valor y copiar en nuevas columnas@pacco ,
Vamos a ver cómo puedo tratar de ayudar. Lo primero es lo primero, una solicitud de mi parte es cuando esté pegando código, péguelo usando el bloque de código "JSL", para que sea fácil para los miembros de la comunidad leer su código. Ahora, una vez que nos hayamos ocupado de eso, revisando su código:
1. vals 1 = Seleccione Donde (:valor p (prueba bilateral)2 <= 0,09); / /parece que el "2" en el nombre de la columna es confuso, pero desafortunadamente, llevaría mucho tiempo revisar todas las tablas y cambiar el nombre de la columna
- Cuando tienes un nombre complicado como este para una columna y no quieres cambiarlo, sería recomendable usar el name() . por lo que la línea anterior debe reescribirse como:
vals1 = Select Where (Name("p-value (two-sided test)2 ")<= 0,09); // I don't know if you are using European convention for the comma instead of decimal2. Ahora, una instrucción select where es un mensaje que se emite a una tabla de datos, por lo que la línea de código anterior debe refinarse aún más como:
vals1 = dt << Select Where (Name("p-value (two-sided test)2") <= 0,09); Si tuviera la amabilidad de probar estas sugerencias y tal vez proporcionar un conjunto de datos de muestra, también puedo intentar solucionar los otros problemas.