Sélection de valeur et copie dans de nouvelles colonnesHé,
J'essaie d'automatiser un (apparemment assez facile) sélection de valeur, création de colonne et copier/coller processus, cependant, je ne trouve pas la bonne compilation de scripts pour cela.
1) Je dois créer 3 nouvelles colonnes l'ajout d'une sélection différente de valeurs à partir d'un même colonne source à chacune de ces 3 nouvelles colonnes et créez un sous-ensemble de chaque sélection lorsque toutes les colonnes sont remplies .
2) Le nom des sous-ensembles doit correspondre à l'en-tête du fichier source d'origine plus une nouvelle annexe.
Savoir:
L'emplacement des colonnes et le nombre de lignes varient dans les fichiers de données que j'ai, cependant, les noms sont tous les mêmes.
J'ai essayé ces deux scripts qui bien sûr ne sont pas corrects mais je ne sais pas quoi changer exactement pour que ça marche. Aucune suggestion?
Version 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>
Version 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>
Je serais très heureux de trouver une solution car dans les fils de discussion jusqu'à présent, il y a souvent un copier/coller dans de nouvelles tables de données, cependant, "jamais" dans une nouvelle colonne, et cela semble principalement lié à une sélection de chaînes. Je ne sais pas si la sélection fonctionne de la même manière pour les données numériques.
Merci pour toute aide!
Re : Sélection de valeur et copie dans de nouvelles colonnesHé, voici la version complète sans les fonctions Afficher car celles-ci n'étaient d'aucune utilité dans mon cas.
Merci pour votre aide!
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 : Sélection de valeur et copie dans de nouvelles colonnesHé, voici la version complète sans les fonctions Afficher car celles-ci n'étaient d'aucune utilité dans mon cas.
Merci pour votre aide!
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 : Sélection de valeur et copie dans de nouvelles colonnes@Jeff_Perkinson
Merci Jeff,
J'avais lu votre message trop tard. Je viens d'ajouter la partie créer des sous-ensembles à la sélection que vous avez proposée et à part la création de nom automatisée cela fonctionne parfaitement. Merci pour la suggestion.
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 : Sélection de valeur et copie dans de nouvelles colonnesRe : Sélection de valeur et copie dans de nouvelles colonnes@uday_guntupalli
J'ai exécuté le script avec mes données (votre version et avec l'échange de la suggestion de @Mark_Bailey ) et cela fonctionne pour créer les colonnes et pour obtenir les données sélectionnées dans la nouvelle colonne.
Cependant, la dernière partie (voir ci-dessous) pour afficher les lignes sélectionnées ne fonctionne pas. Je l'ai ajusté avec un Select Where et Create Subset.
/* 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 : Sélection de valeur et copie dans de nouvelles colonnesMerci d'avoir posté plus de détails, cela aide certains.Au lieu d'essayer de créer les nouvelles colonnes et de les remplir avec des valeurs tout au long de JSL, je créerais simplement trois nouvelles colonnes basées sur des formules avec la formule :
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" )
)
)
);
Mais, je dois admettre que je ne suis toujours pas sûr de la valeur des tables de données avec uniquement les lignes significatives à un niveau particulier. Comment allez-vous utiliser ces tableaux ? Ont-ils besoin des trois colonnes d'indicateurs de signification (c'est-à-dire, sign_0,09 ; sign_0,05 ; et sign_0,01) ? Si ce n'est pas le cas, vous pouvez éviter de créer toutes ces colonnes ensemble et simplement créer des sous-ensembles de lignes inférieures à chaque niveau. Pouvez-vous nous en dire plus sur votre objectif ultime et pourquoi vous voulez des tableaux de données comme vous les décrivez ? Nous pouvons être en mesure de fournir des méthodes encore plus simples.
Re : Sélection de valeur et copie dans de nouvelles colonnesJe vois cette approche, mais il existe un moyen plus simple qui implique de modifier l'état de la ligne sélectionnée. Au lieu de cela:
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;
Vous pouvez simplement utiliser ceci :
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 cette façon, vous ne perturbez pas la sélection de ligne actuelle.
Re : Sélection de valeur et copie dans de nouvelles colonnesÇa a l'air génial. Je vais le tester dès que possible.
Si vous faites référence à des éléments communs dans les 3 nouvelles colonnes, ce n'est le cas que pour les valeurs sélectionnées qui seront ajoutées à chacune des colonnes !
Par exemple, la sélection de valeurs <= 0,01 apparaîtra également dans les colonnes avec 0,05 et 0,09 et celles <= 0,05 apparaîtront également dans 0,09.
Simplifié:
A = [ 0,01 , 0,05 ,0,09]
B = [ 0,01 , 0,05 ]
C = [ 0,01 ]
Cependant, il n'y aura PAS d'autre modèle ou type de structure "chaque deuxième rangée est égale dans les trois rangées".
Ainsi, oui, il existe peut-être un moyen de travailler avec des matrices et de rendre l'ensemble du processus plus fluide.
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 : Sélection de valeur et copie dans de nouvelles colonnes@Pacco ,
Ok, cela devrait vous permettre d'atteindre 90 % du chemin.
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 ,
Existe-t-il un moyen simple de trouver des éléments communs entre les matrices ? Peut-être que Design() pourrait aider, mais pouvez-vous fournir un exemple
A = [1,2,3,4,5,6];
B = [1,2,3];
C = [3,5];
// The common element would be 3
Je sais que je pourrais utiliser des tableaux associatifs et la fonctionnalité d'intersection, mais les matrices ne devraient pas avoir un moyen simple de déterminer les éléments communs/peu communs.
Re : Sélection de valeur et copie dans de nouvelles colonnesSalut Jef,
Merci d'avoir regardé aussi.
J'ai joint les fichiers dans ma réponse ci-dessus! J'espère qu'ils clarifieront ma question.
Re : Sélection de valeur et copie dans de nouvelles colonnesRe : Sélection de valeur et copie dans de nouvelles colonnesHé,
Merci beaucoup pour votre contribution. C'est déjà très utile à savoir.
Je suis désolé pour la mauvaise copie du script. Je m'en souviendrai pour la prochaine fois.
Pour clarifier ce que j'essaie de faire, je joins un aperçu par étapes de ce à quoi le résultat devrait ressembler. J'espère que le guide donne plus de clarté.
Je joins également l'exemple au format jmp.
Merci pour l'aide!
Re : Sélection de valeur et copie dans de nouvelles colonnesJ'ai lu votre description de ce que vous essayez de faire mais j'ai du mal à comprendre sans un exemple concret. De plus, étant donné que votre JSL ne fait pas ce que vous voudriez qu'il fasse, il est difficile de l'utiliser pour deviner comment vous aider.
Pourriez-vous publier plus de détails sur exactement ce que vous essayez de faire, de préférence avec des captures d'écran des tableaux de données en question et ce que vous aimeriez obtenir ? Je pense que cela nous aiderait dans la Communauté à vous aider plus directement.
Merci.
Re : Sélection de valeur et copie dans de nouvelles colonnes@Pacco ,
Voyons comment je peux essayer d'aider. Tout d'abord, une demande de ma part est que lorsque vous collez du code, veuillez le coller en utilisant le bloc de code "JSL", afin qu'il soit facile pour les membres de la communauté de lire votre code. Maintenant, une fois que nous nous en sommes occupés, en parcourant votre code :
1. vals 1 = Select Where (:p-value (test bilatéral)2 <= 0,09); / /il semble que le "2" dans le nom de la colonne prête à confusion, mais malheureusement, il faudrait beaucoup de temps pour parcourir toutes les tables et changer le nom de la colonne
- Lorsque vous avez un nom compliqué comme celui-ci pour une colonne et que vous ne voulez pas le changer, il serait conseillé d'utiliser le nom() . donc la ligne ci-dessus doit être réécrite comme suit :
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. Maintenant, une instruction select where est un message envoyé à une table de données. La ligne de code ci-dessus doit donc être affinée comme suit :
vals1 = dt << Select Where (Name("p-value (two-sided test)2") <= 0,09); Si vous avez la gentillesse d'essayer ces suggestions et peut-être de fournir un exemple d'ensemble de données, je peux également essayer de résoudre les autres problèmes.