Sélectionnez les entrées de ligne dupliquées, enregistrez leur index, puis créez une nouvelle liste qui ne contient pas les lignes dupliquées.Salut.
Ceci fait suite à la question de ce lien : Résolu : obtenir les valeurs de sélectionnez où - Communauté d'utilisateurs JMP . À la fin de cette discussion (dans le lien fourni), il existe un moyen de sélectionner certaines lignes et de les imprimer à l'aide de la fonction show(). Dans un autre article (j'ai perdu le lien), il existait une méthode permettant de sélectionner les lignes dupliquées à l'aide de la fonction Select Duplicated Row(), puis de les supprimer.
Mon objectif est de sélectionner les lignes dupliquées, puis d'obtenir leur index pour une colonne sélectionnée du tableau. Par exemple, je souhaite rechercher les entrées en double pour la colonne âge dans la grande table des classes.
Le deuxième objectif est de créer une nouvelle colonne contenant uniquement les lignes uniques sans supprimer la ligne dupliquée.
Toute orientation est appréciée.
dt_limit = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_limit:age << Select Duplicate Rows( Match (:age, :age ) );
Group1List = (dt_limit:age[dt_limit << get selected rows]);
theCount = N Rows( dt << get selected rows);
Show( Group1List);
Automatisation et scriptsAnalyse et modélisation des données de baseAccès aux donnéesRe : Sélection des entrées de lignes dupliquées, enregistrez leur index, puis créez une nouvelle liste qui ne contient pas les lignes dupliquées.Merci @Jed_Campbell . C'est bien merci beaucoup !
J'essaie de capturer cette colonne dans une liste pour d'autres actions. Pourriez-vous m'aider avec ça ? merci!
Re : Sélection des entrées de lignes dupliquées, enregistrez leur index, puis créez une nouvelle liste qui ne contient pas les lignes dupliquées.Cette ligne ajoutée à la fin de votre script devrait placer cette colonne dans une liste :
future_list = as list (dt_limit:Unique << Get Values);
Re : Sélection des entrées de lignes dupliquées, enregistrez leur index, puis créez une nouvelle liste qui ne contient pas les lignes dupliquées.Merci @Jed_Campbell . Cela fonctionne parfaitement bien.
Un autre problème que je rencontre en ce moment est que se passerait-il si, au lieu d'avoir une colonne, c'est-à-dire l'âge, j'avais une liste de colonnes, c'est-à-dire [âge, taille, poids, etc.]. Comment le code changerait-il ? J'ai essayé d'utiliser une combinaison de colonnes et d'eval pour récupérer l'entrée de la liste sous forme de colonne. Je sais que le code ci-dessous fonctionne, mais comment puis-je le modifier pour qu'il fonctionne pour n'importe quelle liste de colonnes. Aurait quelque chose comme As column (ListOfTargetCol[i])[i] ); OU :(ListOfTargetCol[i])[i] ); signifie que jmp récupérera la ième entrée de la liste, puis il récupérera cette colonne (la colonne) ième entrée ? Je suis nouveau sur JSL et je ne sais pas comment il est structuré. Veuillez nous indiquer comment surmonter ce problème.
Pour référence, j'utilise un code similaire à celui que vous avez fourni ci-dessus et j'ai essayé d'ajouter quelque chose comme ceci : je suis également curieux de savoir si ce sera différent s'il s'agit d'une liste de noms d'une chaîne comme celles ci-dessous. Merci beaucoup!
ListOfTargetCol = { age, height, weight};
StringOfTargetCol = { "age", "height", "weight"};
... dt_limit:Unique[i] = dt_limit:( As coulmn(ListOfTargetCol[1])) [i]...
Re : Sélection des entrées de lignes dupliquées, enregistrez leur index, puis créez une nouvelle liste qui ne contient pas les lignes dupliquées.Est-ce que vous recherchez quelque chose comme ça ? Il existe peut-être des façons plus élégantes d'y parvenir, mais voici une façon de créer une nouvelle colonne avec uniquement la première ligne unique.
dt_limit = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_limit << Select Duplicate Rows( Match (:age ) );
Group1List = (dt_limit << get selected rows);
theCount = N Items (Group1List);
//create a new column that has only the unique rows without deleting the duplicated row
dt_limit << Invert Row Selection;
UniqueList = dt_limit << Get Selected Rows;
dt_limit << new column ("Unique");
for each ({i}, UniqueList,
dt_limit:Unique[i] = dt_limit:age[i]
);Re : Sélection des entrées de lignes dupliquées, enregistrez leur index, puis créez une nouvelle liste qui ne contient pas les lignes dupliquées.Si vous n'avez pas besoin des sélections, vous pouvez également utiliser la formule/résumé (ou bien d'autres options)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;
// Option2
dt << New Column("Row", Numeric, "Continuous", Formula(Row()));
dt_summary = dt << Summary(
Group(:age),
Min(:Row),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
Column(dt_summary, 1) << Set Name("R2");
dt << Update(With(dt_summary), Match Columns(:Row = :Row));
Close(dt_summary, no save);

Re : Sélection des entrées de ligne dupliquées, enregistrement de leur index, puis création d'une nouvelle liste qui ne contient pas les lignes dupliquées.Merci @jthi pour ton aide ! Les deux solutions fonctionnent bien, mais je ne sais toujours pas quelle syntaxe utiliser.
In the loop below, we have the dt:age[i] which iterates through the "age" column in the dt_limit loop. <BR />What if I want to have more than one column to iterate through.<BR /><BR /> The only solution I can find (and works with no error) is to copy past the loop for <BR />all the needed columns i.e. age, height, ..etc. It is just not efficient and will not work for a large number of columns. <BR /><BR />Any suggestions would be appreciated.
<BR />
for each ({i}, UniqueList,
dt_limit:Unique[i] = dt_limit:age[i]
);Re : Sélection des entrées de ligne dupliquées, enregistrement de leur index, puis création d'une nouvelle liste qui ne contient pas les lignes dupliquées.Je ne sais pas exactement ce que vous essayez de faire. Vous pouvez ajouter plus de colonnes à Col Min en tant que byvars
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age, :sex), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;

Col Minimum(nom, )
Re : Sélection des entrées de ligne dupliquées, enregistrement de leur index, puis création d'une nouvelle liste qui ne contient pas les lignes dupliquées.Merci @jthi . C'est vrai. Je peux simplement ajouter plus de colonnes comme vous l'avez suggéré ci-dessus. Cependant, j'essaie de généraliser la solution. Ce que j'essaie de faire, c'est de prendre l'entrée utilisateur pour les colonnes à évaluer. Placez-les dans une liste. Et puis, évaluez-les tous. Par exemple, l'utilisateur peut choisir uniquement l'âge et la taille. J'ai besoin que le code soit aussi flexible que possible.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
TargetList = {age, sex, height};
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age, :sex), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;Re : Sélection des entrées de ligne dupliquées, enregistrement de leur index, puis création d'une nouvelle liste qui ne contient pas les lignes dupliquées.Vous pouvez construire la formule avec des expressions
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
sel_cols = {"age", "sex", "height"};
colmin_expr = Expr(Col Min(Row()));
For Each({sel_col}, sel_cols,
Insert Into(colmin_expr, Name Expr(AsColumn(dt, sel_col)))
);
Eval(Substitute(
Expr(new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == _colminformula_, :age, .)
))),
Expr(_colminformula_), Name Expr(colmin_expr)
));
dt << Run Formulas;
new_col << Delete Formula;
Vous devriez également pouvoir modifier assez facilement la version récapitulative pour qu'elle fonctionne avec les entrées d'une liste.