Compter les valeurs dans chaque ligneJ'ai un script avec col 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 (l'a fait manuellement les 2 dernières colonnes)

en lisant le forum, je comprends que je dois convertir DT en matrice, mais je ne parviens pas à le faire fonctionner.
Merci!
ScriptRe: Compter les valeurs dans chaque lignePetite question, en avez-vous besoin par colonne ou globalement ?
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 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 ligneAutrement.
Formule de colonne pour compter sur la ligne
Cette formule utilise un indice de 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 {Colonne1, Colonne 2, ... Colonne N} à la place, car lorsque j'ai changé l'une des valeurs en "xyzzy", les valeurs des colonnes de formules n'ont pas été mises à jour jusqu'à ce que j'aie forcé les formules à réexécuter. Si JMP ne peut pas dire qu'une colonne fait référence à une autre colonne, il ne sera pas réévalué.
Cela fonctionne mieux :
formule avec des noms de colonnes explicites
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 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 ligneSalut,
Une autre méthode consiste à concaténer toutes les colonnes avec une transformation en un clic.
Étant donné que "test" est 1 caractère de plus que POR, et qu'il n'y a aucune donnée manquante, 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 d'intérêt et cliquez avec le bouton droit, en sélectionnant comme ci-dessous. Renommez ensuite la colonne "concat" pour plus 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 donc 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 nombre 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'aime ça, Craige.
Il semble que la fonction de matrice de conception puisse gérer cette idée, essayez également 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 ligneHé, ça ne marche pas
par exemple si je l'exécute sur ce
| 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 sortent comme 0
ce à quoi je m'attendrais lorsque j'exécuterais le "test" est : 0,2,2,0,0,2,3
donc la sortie 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 |