Effectuer une formule sur des colonnes de sous-ensembleJ'ai créé un script pour créer un sous-ensemble d'une table plus grande, mais il ne fonctionne pas correctement. Mon objectif est que l'utilisateur sélectionne les colonnes qu'il souhaite dans la table de sous-ensemble, puis que le script exécute une formule sur les colonnes avant de placer les données dans la nouvelle table.Jusqu'à présent, mon script affichera la boîte de dialogue pour l'interaction de l'utilisateur, mais lorsque je sélectionne les colonnes dans la boîte de dialogue, ce ne sont pas celles qui apparaissent dans le tableau des sous-ensembles. Je ne sais pas où réside mon problème avec ça. (Remarque : l'utilisateur sélectionnera des colonnes contenant des données, plutôt que des exemples d'informations, donc dans l'exemple, des colonnes dont les noms commencent par "Colonne 10...".)
De plus, je ne sais pas où j'insérerais la formule. Fondamentalement, les colonnes que l'utilisateur sélectionne dans la boîte de dialogue auront des cellules avec des symboles <, pour la nouvelle table de sous-ensemble, j'aimerais que toute cellule sans symbole inférieur à se transforme en zéro et que toute cellule avec un symbole < ait le symbole < supprimé en plaçant uniquement le numéro à côté dans le tableau des sous-ensembles. Ainsi, le nouveau tableau de sous-ensembles contient des zéros pour les valeurs détectées et la limite de détection pour les composés non détectés.
Voici mon script jusqu'à présent.
Names Default To Here( 1 );
dt = Data Table("Example Data");
col_dlg = new window("Column Select",
panelbox("Select columns to create NonDetect table with",
col_clist = collistbox(all, width(200)),
buttonbox("Ok",
selected_column_list = col_clist << getselected;
dt2 = dt << Subset(Output Table("NonDetect"),columns(col_clist));
col_dlg << close window;
)
)
);Merci pour toute aide !
Re : Effectuer une formule sur des colonnes de sous-ensembleC'est maintenant votre chance de rémunérer les contributeurs de la communauté de discussion........ fouillez dans le guide de script et l'index de script en devenant un utilisateur expérimenté et redonnez en retour par votre participation.
Re : Effectuer une formule sur des colonnes de sous-ensembleÇa a marché! Merci beaucoup pour votre temps et votre patience. Je l'apprécie vraiment!
Lacé
Re : Effectuer une formule sur des colonnes de sous-ensembleIl s'avère que la fonction Substr() ne fonctionne pas sur les lignes sélectionnées (je ne sais pas pourquoi), j'ai donc un peu modifié le code et l'ai testé (je n'avais évidemment pas testé ma dernière version)
Names Default To Here( 1 );
dt = Data Table( "Example Data" );
col_dlg = New Window( "Column Select",
Panel Box( "Select columns to create NonDetect table with",
col_clist = Col List Box( all, width( 200 ) ),
Button Box( "Ok",
selected_column_list = col_clist << getselected;
dt2 = dt << Subset( Output Table( "NonDetect" ), columns( selected_column_list ) );
// Loop across the columns in the new data table and convert them to numeric
// Cells with nonnumeric values will be set to Missing Values, which then can
// be identified and set to 0
For( i = 1, i <= N Items( selected_column_list ), i++,
// Select all of the currently non selected columns and unselect the current ones
dt2 << select where( Contains( As Column( dt2, selected_column_list[i] ), "<" ) == 0 );
// Set for the target column all of the currently selected rows to "0"
Column( dt2, selected_column_list[i] )[dt2 << get selected rows] = "0";
// Find the rows with the "<" in them
dt2 << invert row selection;
selRows = dt2 << get selected rows;
//selRows= dt2 << Get Rows Where(Contains(As Column( dt2, selected_column_list[i] ),"<" )==1);
// Get rid of the "<" making the value a valid numeric value
For( k = 1, k <= N Rows( selRows ), k++,
Column( dt2, selected_column_list[i] )[selRows[k]] = Substr( As Column( dt2, selected_column_list[i] )[selRows[k]], 2 )
);
// Convert the column to a numeric/continuous column
Column( dt2, selected_column_list[i] ) << data type( numeric ) << modeling type( continuous );
);
col_dlg << close window;
)
)
);Re : Effectuer une formule sur des colonnes de sous-ensemblePeut-être que j'ai mis le (au mauvais endroit ? Voici ce que j'ai en ce moment.
Names Default To Here( 1 );
dt = Data Table( "Example Data" );
col_dlg = New Window( "Column Select",
Panel Box( "Select columns to create NonDetect table with",
col_clist = Col List Box( all, width( 200 ) ),
Button Box( "Ok",
selected_column_list = col_clist << getselected;
dt2 = dt << Subset( Output Table( "NonDetect" ), columns( selected_column_list ) );
// Loop across the columns in the new data table and convert them to numeric
// Cells with nonnumeric values will be set to Missing Values, which then can
// be identified and set to 0
For( i = 1, i <= N Items( selected_column_list ), i++,
// Select the rows where there is a "<" for the target column
dt2 << Select where(Contains(As Column( dt2, selected_column_list[i] ),"<" )==1);
// Get rid of the "<" making the value a valid numeric value
Column( dt2, selected_column_list[i] )[dt2 << get selected rows ()] =
substr(As Column( dt2, selected_column_list[i] ),2);
// Select all of the currently non selected columns and unselect the current ones
dt2 << invert row selection;
// Set for the target column all of the currently selected rows to "0"
Column( dt2, selected_column_list[i] )[dt2 << get selected rows ()] = "0";
// Convert the column to a numeric/continuous column
Column( dt2, selected_column_list[i] ) << data type( numeric ) <<
modeling type( continuous );
);
col_dlg << close window;
)
)
);Re : Effectuer une formule sur des colonnes de sous-ensembleMerci pour votre réponse rapide! J'en ai essayé 2 mais je me retrouve avec des zéros dans les valeurs détectées et des blancs pour toutes les cellules avec des symboles <. Même résultat que j'obtiens avec 1.
Re : Effectuer une formule sur des colonnes de sous-ensembleoups.....mon erreur, changez le "1" dans la fonction substr() en "2" et cela devrait résoudre le problème
Re : Effectuer une formule sur des colonnes de sous-ensembleLe deuxième code que vous avez envoyé pour la deuxième table ne semble pas fonctionner. J'ai passé quelques heures à essayer différentes choses. J'ai remarqué qu'il manquait deux (). Cela a permis au code de s'exécuter sans erreur, mais la partie du code qui supprime le symbole "<" ne semble pas fonctionner correctement. Si je supprime ce morceau de code, le tableau se retrouve avec les valeurs détectées à 0 et les valeurs ND toujours intactes, avec le symbole <. J'ai essayé de jouer avec mais je n'ai pas encore compris. Des indices ? 
Merci!
Re : Effectuer une formule sur des colonnes de sous-ensembleVoici le code pour gérer votre deuxième cas
Names Default To Here( 1 );
dt = Data Table( "Example Data" );
col_dlg = New Window( "Column Select",
Panel Box( "Select columns to create NonDetect table with",
col_clist = Col List Box( all, width( 200 ) ),
Button Box( "Ok",
selected_column_list = col_clist << getselected;
dt2 = dt << Subset( Output Table( "NonDetect" ), columns( selected_column_list ) );
// Loop across the columns in the new data table and convert them to numeric
// Cells with nonnumeric values will be set to Missing Values, which then can
// be identified and set to 0
For( i = 1, i <= N Items( selected_column_list ), i++,
// Select the rows where there is a "<" for the target column
dt2 << Select where(Contains(As Column( dt2, selected_column_list[i] ),"<" )==1);
// Get rid of the "<" making the value a valid numeric value
Column( dt2, selected_column_list[i] )[dt2 << get selected rows )] =
substr(As Column( dt2, selected_column_list[i] ),1);
// Select all of the currently non selected columns and unselect the current ones
dt2 << invert row selection;
// Set for the target column all of the currently selected rows to "0"
Column( dt2, selected_column_list[i] )[dt2 << get selected rows )] = "0";
// Convert the column to a numeric/continuous column
Column( dt2, selected_column_list[i] ) << data type( numeric ) <<
modeling type( continuous );
);
col_dlg << close window;
)
)
);Re : Effectuer une formule sur des colonnes de sous-ensembleCela fonctionne très bien pour la table Detect, donc pour ma deuxième table, j'aimerais changer les valeurs qui deviennent zéro, donc je ne pense pas que cette approche fonctionnera. Je voudrais conserver les cellules qui ont le symbole < et remettre le reste des cellules à zéro. Ensuite, je voudrais supprimer le symbole < en ne laissant que des valeurs numériques. Dans ma tête, j'imagine que je ferais la boucle telle que vous l'avez, puis j'ajouterais une instruction if/else ?
Et merci d'avoir publié la déclaration if/else. Mon problème n'était pas d'avoir le num() avant le nom de ma colonne pour le reste !
Re : Effectuer une formule sur des colonnes de sous-ensembleVoici un changement dans le script que je pense que vous pourriez trouver comme une bonne approche.Ce que j'interprète comme ce que vous voulez faire, c'est créer une colonne numérique qui contient les valeurs des colonnes de caractères que vous sélectionnez, mais si les valeurs contiennent un symbole "<", définissez ces entrées sur zéro (0).Le script ci-dessous fait cela, sans créer de nouvelles colonnes.Il convertit les colonnes en valeurs numériques et met les cellules "<" à zéro.
Names Default To Here( 1 );
dt = Data Table( "Example Data" );
col_dlg = New Window( "Column Select",
Panel Box( "Select columns to create NonDetect table with",
col_clist = Col List Box( all, width( 200 ) ),
Button Box( "Ok",
selected_column_list = col_clist << getselected;
dt2 = dt << Subset( Output Table( "NonDetect" ), columns( selected_column_list ) );
// Loop across the columns in the new data table and convert them to numeric
// Cells with nonnumeric values will be set to Missing Values, which then can
// be identified and set to 0
For( i = 1, i <= N Items( selected_column_list ), i++,
// Change the column to numeric/continuous
// The names in the data table are very complex, containing symbols, etc.
// that JMP will confuse as operators. Therefore, using the Column()
// function, or a :Name(" ") function to wrap around the column name
// needs to be used
Column( dt2, selected_column_list[i] ) << data type( numeric ) <<
modeling type( continuous );
// Now find all of the rows in the table that have Missing Values
// in the target column, and then set them all to "0" in one
// statement
Column( dt2, selected_column_list[i] )[dt << get rows where(
Is Missing( As Column( dt2, selected_column_list[i] ) )
)] = 0;
);
col_dlg << close window;
)
)
);
Vous pouvez créer de nouvelles colonnes et définir une formule comme vous l'aviez indiqué dans votre dernière réponse.Le problème que vous rencontrez avec ce que vous avez fourni concerne les noms de colonnes complexes. Voici comment cela fonctionnerait
If( Contains( :Name( "Column 10 1,2,3,4,6,7,8-HpCDD" ), "<" ),
0,
Num( :Name( "Column 10 1,2,3,4,6,7,8-HpCDD" ) )
)
Re : Effectuer une formule sur des colonnes de sous-ensembleJe pense que c'est là que j'ai du mal, je maîtrise très bien Excel et j'y fais toutes mes analyses de données depuis 9 ans. J'essaie juste de transférer et j'ai du mal avec mes instructions if/then dans jmp (entre autres choses). Je vais l'écrire en termes d'Excel et peut-être pourriez-vous m'aider ?
Je vais créer deux de ces tableaux de sous-ensembles. Un pour les valeurs détectées et un pour les valeurs non détectées. Pour les valeurs détectées, je ferais une instruction if/then telle que =if(isnumber(J2),J2,0). Pour les valeurs non détectées, je ferais quelque chose comme =if(isnumber(J2),0,J2).
J'essayais de le changer dans JMP pour qu'il soit
Si ( Contient ( : Colonne 10 1,2,3,4,6,7,8-HpCDD , "<" ), 0 ,:Colonne 10 1,2,3,4,6,7,8-HpCDD )
mais cela ne semble pas fonctionner même si je crée moi-même une colonne et que j'insère la formule.
Donc, fondamentalement, dans mon script, j'inclurai deux parties, une pour la table NonDetect et une pour la table Detect et j'aimerais que les colonnes soient transformées en tant que telles, en utilisant l'instruction if then ? Je vais à la fin envoyer les deux tables de données à R pour imputer les valeurs non détectées en utilisant les DL restantes dans le sous-ensemble NonDetect. J'éspère que ça l'explique?
Re : Effectuer une formule sur des colonnes de sous-ensembleQuelle est la formule que tu veux calculer ?Est-ce que cela nécessite vraiment la création d’une nouvelle colonne ?N'oubliez pas que ce n'est pas Excel.Pour générer des valeurs ou des résultats, il n'est pas nécessaire de les placer dans des colonnes... il existe d'autres structures.Pouvez-vous décrire plus en détail ce que vous cherchez à faire ?
Re : Effectuer une formule sur des colonnes de sous-ensembleAh, ça marche.
Existe-t-il un moyen de compléter ensuite une formule sur les données avant de les placer dans le nouveau tableau ? Sinon, je pensais alors créer de nouvelles colonnes dans la table de sous-ensemble, terminer le calcul dans les nouvelles colonnes, puis supprimer les colonnes d'origine (à l'aide d'un script). Existe-t-il un moyen plus efficace de procéder ?
Merci!
Re : Effectuer une formule sur des colonnes de sous-ensembleVous faisiez référence à l'objet d'affichage, col_clist, plutôt qu'à son contenu, que vous aviez placé dans Selected_column_list.
Names Default To Here( 1 );
dt = Data Table( "Example Data" );
col_dlg = New Window( "Column Select",
Panel Box( "Select columns to create NonDetect table with",
col_clist = Col List Box( all, width( 200 ) ),
Button Box( "Ok",
selected_column_list = col_clist << getselected;
dt2 = dt << Subset( Output Table( "NonDetect" ), columns( selected_column_list ) );
col_dlg << close window;
)
)
);