Question sur l'itération des lignesBonjour,
Je suis très reconnaissant pour toutes les réponses précédentes et j'en apprends de plus en plus sur JSL chaque jour. À ce stade, je suis à l'aise avec les bases et j'ai appris Pour boucles, Pour chaque ligne et l'utilisation du Formule fonction. Cela a été très utile. Comme je l'ai mentionné dans mon article précédent, je travaille sur un ensemble de données et j'ai 4 colonnes clés :
1) PATIENTID : liste de valeurs uniques pour le numéro de patient
2) VALEUR : valeur de l'évaluation d'un patient à un moment donné
3) HEURE : heure à laquelle l'évaluation du patient a été collectée
4) PARAM : L'évaluation du patient est composée de 4 éléments individuels et d'un score total (ITEM1, ITEM2, ITEM3, ITEM4 et TOTAL). Le score total est simplement une somme de ITEM1+ITEM2+ITEM3+ITEM4.
A partir de là, j'aimerais créer une 5ème colonne (appelée "TEST"). La valeur de TEST est basée sur la logique suivante :
Pour un patient individuel, si ligne de base les valeurs sont :
- TOTAL > 9 ou
- 1 des ITEM1, ITEM2, ITEM3 ou ITEM4 sont > 3 ou
- 3 des ITEM1, ITEM2, ITEM3 ou ITEM4 sont > 2
Ensuite, la ligne correspondante dans "TEST" doit être évaluée comme "OUI". Les valeurs non de base et les autres valeurs doivent être évaluées comme « NON ». Cette logique doit être itérée sur chaque patient et sur chaque ligne de la table de données.
J'ai des problèmes pour parcourir les lignes de mon ensemble de données. La raison est que chaque patient a un nombre différent de points dans le temps pendant lesquels il a rempli l'échelle. Certains patients ont abandonné prématurément. Étant donné que chaque patient a un nombre différent de lignes, j'ai du mal à comprendre comment parcourir les lignes pour écrire le script.
J'ai essayé de combiner certaines instructions IF, mais je reste bloqué au point où je dois passer à l'ID de patient suivant. Je joins un script que j'ai écrit, mais je suis resté bloqué. Toute aide est grandement appréciée.
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", Character, Formula(
If(:TIME == "BASELINE",
theRow = Row();
thePatient = :PATIENTID;
If(:PARAM == "TOTAL",
If(N Rows(dt << Get Rows Where(
Row()>=theRow &
thePatient == :PATIENTID &
:VALUE > 9
)
) > 0
,"YES"
,"NO"
)))
));Voici un exemple de ce à quoi ressemble le tableau de données (informations réelles sur le patient expurgées pour des raisons de confidentialité)

Re : Question sur l'itération des lignesMerci, c'est tout à fait logique maintenant. Merci d'avoir pris le temps d'expliquer, c'est très utile !!
Re : Question sur l'itération des lignes@SrihariGopal ,
Votre premier message vous explique comment les formules et Set Each Value() parcourent les lignes.Voici donc quelques informations à garder à l’esprit :
- Les instructions logiques sont évaluées comme vraies ou fausses. Vrai équivaut à 1 et Faux équivaut à zéro
- Supposons que x soit une valeur numérique. La fonction JSL If( x, "YES", "NO" ) examine la valeur de x. Si x > 0, alors le résultat est True(1)=>YES , sinon False(0)=>NO.
- :TIME == "BASELINE" est une instruction logique qui renvoie un 1 ou un 0 donc au lieu d'utiliser un "AND" (&), la fonction de multiplication fonctionnera. En d'autres termes, TIME doit être égal à BASELINE et l'une des règles doit être vraie, c'est-à-dire 1*1 = 1. Si l’un ou l’autre est faux, le résultat est zéro ou faux.
- La fonction externe Maximum() a 3 arguments, les 3 règles. Cette fonction maximale remplace "OR" ( | ). Si les 3 règles sont fausses, le maximum externe renvoie un 0. Si l'une des 3 règles renvoie un 1 (Vrai), alors le Maximum renvoie un 1. Mais gardez à l’esprit que ce résultat a un multiplicateur logique et qu’il ne s’applique donc qu’aux valeurs BASELINE.
- Concernant les règles : la règle n°1 ( :TOTAL > 9 ) renvoie un 1 ou un 0. La règle n°2 trouve le maximum des 4 éléments, si celui-ci est supérieur à 3, alors au moins un élément est supérieur à 3. La règle n°3 est la somme de 4 résultats logiques (ITEM 1 >2, etc.) Si cette somme est supérieure à 2, alors 3 ou 4 des items sont supérieurs à 2.
L’utilisation de l’arithmétique sur des instructions logiques permet de trouver plus facilement et plus rapidement des cas qui satisfont aux règles « k sur n ». Il existe d'autres méthodes comme concaténer les 4 ÉLÉMENTS et vérifier s'ils sont dans { "0111", "1011", "1101", "1110"} ou les rendre numériques et rechercher ces valeurs.Mais la somme ne nécessite qu'un seul contrôle (>2).Puisque j'utilisais l'arithmétique pour la règle n°3, j'ai utilisé des fonctions mathématiques, Maximum() au lieu de OR, et multiplié au lieu de AND pour la logique restante.Notez que vous pouvez avoir des instructions qui mélangent des fonctions logiques avec des fonctions mathématiques.
J'espère que cela pourra aider.
Re : Question sur l'itération des lignesMerci beaucoup! Cela a parfaitement fonctionné.
Je suis en train de lire le script et je me demandais si vous pouviez m'expliquer un peu plus. Comment fonctionne la fonction MAXIMUM dans ce contexte ? Je comprends que vous recherchez un maximum des 3 règles. Cependant, je vois l'opérateur *, qui, je suppose, signifie multiplication. J'étais confus quant à la façon dont la multiplication et la fonction MAXIMUM fonctionnent ensemble dans l'instruction IF.
Merci beaucoup!Re : Question sur l'itération des lignes@SrihariGopal ,
Vous avez déclaré que votre objectif était
Pour un patient individuel, si ligne de base les valeurs sont :
- TOTAL > 9 ou
- 1 des ITEM1, ITEM2, ITEM3 ou ITEM4 sont > 3 ou
- 3 des ITEM1, ITEM2, ITEM3 ou ITEM4 sont > 2
Ensuite, la ligne correspondante dans "TEST" doit être évaluée comme "OUI". Les valeurs non de base et les autres valeurs doivent être évaluées comme « NON ». Cette logique doit être itérée sur chaque patient et sur chaque ligne de la table de données.
Des règles complexes dans un tableau empilé peuvent être appliquées, mais elles deviennent compliquées. C'est beaucoup plus simple à gérer si la table est dépilée par PATIENTID et TIME, où les règles sont appliquées par PARAM. Si le tableau est extrêmement grand, cette méthode pourrait ne pas être efficace.
Ci-joint votre exemple de tableau avec deux PATIENTID supplémentaires pour tester ces 3 règles.Avant d'utiliser le script ci-joint, vous devez vérifier si la formule capture correctement vos 3 règles. J'ai ajouté une colonne de commentaires et des couleurs pour faciliter la vérification.

Une fois divisée, voici la formule de la colonne TEST à trois règles. Le script inclut également le code JSL pour dépiler et réorganiser la table.
dt_split:TEST << Set Each Value(
If(
(:TIME == "BASELINE") *
Maximum(
:TOTAL > 9, //rule 1
Maximum( :ITEM1, :ITEM2, :ITEM3, :ITEM4 ) > 3, //rule 2
(:ITEM1 > 2) + (:ITEM2 > 2) + (:ITEM3 > 2) + (:ITEM4 > 2) >= 3 //rule 3
),
"YES",
"NO"
));
.