Compter les valeurs dans chaque ligneJ'ai un script avec les colonnes 1 à 6 dans une liste
J'essaie d'écrire un script JSL qui comptera combien de fois le mot POR apparaît et combien de fois le mot test apparaît
exemple ci-dessous (je l'ai fait manuellement les 2 dernières colonnes)

en lisant le forum, je comprends que je dois convertir DT en matrice, mais je n'arrive pas à le faire fonctionner.
merci!
Automatisation et scriptsRe : Compter les valeurs dans chaque ligneJe sais... mais c'est une méthode étonnamment bonne d'un point de vue temporel. Il est intéressant de noter que la méthode concat, aussi étrange soit-elle, est également très rapide.
Par exemple, pour un tableau de 200 000 lignes x 10 colonnes (fichier compressé joint) de ces valeurs, voici les temps d'exécution :

Names Default To Here( 1 );
dt = Current Data Table();
t1 = HP Time();
dt << new column("xx",
formula(sum( design (dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], {"test"})))
);
t2 = hptime();
dt << New Column( "xx",
formula(
count = 0;
dt = :Col1 << get data table;
For( i = 1, i <= 10, i++,
If( Column( dt, i )[Row()] == "test", count ++)
);
count;
)
);
t3 = hptime();
dt << new column("xx", formula(nrow(loc(dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], "test"))));
t4 = hptime();
dt << new column("concat", character, formula(Col1 || :Col2 || :Col3 || :Col4 || :Col5 || :Col6 || :Col7 || :Col8 || :Col9 ||:Col10));
dt << new column("xx", formula(length(:concat)-30));
t5 = hptime();
print(evalinsert("Design matrix method: ^(t2-t1)/1e6^ seconds."));
print(evalinsert("Looping method: ^(t3-t2)/1e6^ seconds."));
print(evalinsert("Nrow(Loc()) method: ^(t4-t3)/1e6^ seconds."));
print(evalinsert("Concat method: ^(t5-t4)/1e6^ seconds."));
Re : Compter les valeurs dans chaque ligneTrès cool.......mais je pense que tu es entré un peu dans le grand abîmeRe : Compter les valeurs dans chaque ligneJ'aime ça, Craige.
Il semble que la fonction de matrice de conception puisse également gérer cette idée : essayez cette formule pour compter le nombre de « a ».
dt = :Col1 << get data table;
Sum( Design( dt[Row(), {:Col1, :Col2, :Col3, :Col4, :Col5}], {"a"} ) );
Re : Compter les valeurs dans chaque ligneAutrement.
Column formula to count across rowColumn formula to count across rowFormule de colonne pour compter sur la ligne
Cette formule utilise l'indexation de la table de données pour obtenir une liste telle que {"test","POR","test","test"} pour la ligne 8.
Ci-dessus, j'ai utilisé 1::4, qui se transforme en Index(1,4) comme raccourci. Vous devez utiliser {Column1, Colonne 2, ... Colonne N} à la place, car lorsque j'ai modifié l'une des valeurs en "xyzzy", les valeurs des colonnes de formules n'ont pas été mises à jour jusqu'à ce que j'ai forcé la réexécution des formules. Si JMP ne peut pas déterminer qu'une colonne fait référence à une autre colonne, il ne procédera pas à une réévaluation.
Cela fonctionne mieux :
formula with explicit column namesformula with explicit column namesformule avec des noms de colonnes explicites
Re : Compter les valeurs dans chaque ligneSalut,
Veuillez consulter la propriété « Value Labels » de JMP, ainsi que les utilitaires de colonnes « Labels to Codes » et « Codes to Labels ».
Je m'en voudrais de ne pas préconiser l'utilisation du chiffre 1 pour POR et 0 pour test (1 : test et 0 : POR si vous préférez). En utilisant la propriété de colonne Value Label, nous pouvons faire apparaître ces valeurs comme si elles étaient "test" et "POR", mais en interne, ce sont des 0 et des 1.
Étant donné que les valeurs sont numériques, les calculs peuvent être effectués à l’aide de formules natives de colonnes et de lignes. Dans le cas des 1 et des zéros, la somme donne le nombre de 1, tandis que la moyenne donne la proportion de un. Dans cet exemple, si nous stockons POR sous la valeur 0 et "test" sous la valeur 1, nous pouvons trouver le nombre de tests dans une ligne donnée simplement en sélectionnant toutes les colonnes qui nous intéressent, en cliquant avec le bouton droit et en choisissant Nouvelle colonne de formule > Combiner > Somme dans le menu contextuel.
Vous trouverez ci-dessous une image de ce à quoi cela ressemble dans la pratique. Les cellules semblent contenir du texte, car les mots POR et test sont justifiés à gauche, mais lorsque vous cliquez sur une cellule, vous pouvez voir qu'en fait JMP stocke un numéro en interne, similaire à ce qui est fait avec les dates et les heures.

En cliquant sur le * à droite des noms de colonnes dans le volet Colonnes (centre gauche du tableau de données), nous pouvons sélectionner « Étiquettes de valeur » pour afficher les paramètres actuels de la propriété :

Acclamations,
Brady
Re : Compter les valeurs dans chaque lignebonne idée
Re : Compter les valeurs dans chaque ligneSalut,
Une autre méthode consiste à concaténer toutes les colonnes avec une transformation en 1 clic.
Étant donné que "test" contient 1 caractère de plus que POR et qu'il ne vous manque aucune donnée, la chaîne résultante augmentera de 1 caractère pour chaque "test" contenu, par rapport à une piqûre de "POR" uniquement.
Pour concaténer, sélectionnez les colonnes qui vous intéressent et cliquez avec le bouton droit, en sélectionnant comme ci-dessous. Renommez ensuite la colonne "concat" par souci de concision.

Dans l'exemple de tableau ci-dessous, il y a 6 colonnes d'intérêt ; une chaîne avec uniquement des "POR" aurait ainsi 6 * 3 = 18 caractères.
On utilise donc les formules :
length(:concat) - 18 pour le nombre de "test" == n_test.
et
6 - n_test pour le numéro de "POR".
En général, pour n_test, nous utiliserions (length(:concat) - 18)/k, où k est la différence de caractères entre les 2 phrases. Ici, puisque k == 1, nous l'omettons.

Acclamations,
Brady
Re : Compter les valeurs dans chaque ligneJ'ai créé dans JMP le tableau comme vous l'avez fourni

J'ai ensuite créé une nouvelle colonne et appliqué la formule suivante à cette colonne
count = 0;
For( i = 1, i <= 4, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
Attention, la boucle For() ne va que jusqu'à 4, car il n'y a que 4 colonnes dans la table à traiter
Cela donne les résultats suivants

J'ai joint le tableau de données
Je vous suggère fortement de prendre le temps de lire le document Découverte de JMP, disponible dans le menu déroulant Aide.
Re : Compter les valeurs dans chaque lignepour tous, mais c'est par rangée
comme chaque ligne compte combien de fois une valeur est apparue à l'intérieur de cette ligne, puis à la fin de cette ligne, j'écris la valeur "count"
voir mon exemple ci-dessous, j'ai ajouté un tableauRe : Compter les valeurs dans chaque ligneHé, ça ne marche pas
par exemple si je l'exécute sur ceci
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| test | POR | POR | test |
| test | POR | POR | test |
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| test | POR | POR | test |
| test | POR | test | test |
les comptes sont à 0
ce à quoi je m'attendrais lorsque j'exécuterais le "test" est : 0,2,2,0,0,2,3
donc le résultat est comme ceci :
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| test | POR | POR | test | 2 |
| test | POR | POR | test | 2 |
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| test | POR | POR | test | 2 |
| test | POR | test | test | 3 |
Re : Compter les valeurs dans chaque ligneVoici les formules qui sont une façon de calculer les comptes
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "POR" ) )
);
count;
Re : Compter les valeurs dans chaque lignePetite question, en avez-vous besoin par colonne ou globalement ?