Question simple sur les bouclesBonjour,
Je suis un utilisateur de longue date de JMP, mais j'ai récemment commencé à me renseigner sur les scripts. J'essaie d'apprendre les bases, et l'une des choses clés que je veux maîtriser est l'utilisation des boucles for.
J'ai donc créé un exemple de jeu de données avec 4 colonnes :
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 : La note du patient est divisée en 4 items et un score total
J'ai écrit un script pour parcourir toutes les lignes de cette table de données et évaluer les valeurs de deux variables différentes (:TIME et :VALUE). Si la condition est remplie, j'aimerais ajouter une valeur de caractère à une ligne d'une nouvelle colonne qui est Oui ou Non.
Voici le script que j'ai écrit. JMP renvoie des valeurs vides pour chacune des lignes de la nouvelle colonne :
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
For (i = 1, i <= tr, i++,
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;Il s'agit d'un script simple, et une fois que j'ai compris la mécanique, j'aimerais ajouter plus de conditions. Mais je suis bloqué à ce stade car le script ne fonctionne pas correctement.
J'ai également essayé d'écrire ce script en utilisant la fonction For Each Row, mais j'ai toujours le même problème.
Des conseils sur ce que je fais de mal ? Désolé s'il s'agit d'une réponse simple, j'ai parcouru la documentation et je n'arrive pas à comprendre ce que je fais de mal.
Re : Question simple sur les bouclesLes boucles sont généralement utilisées pour parcourir les lignes d'un tableau ou sur les éléments d'une liste, c'est pourquoi un incrément de un est le plus courant. Cependant, le troisième argument ne doit pas être i++. Cela pourrait être tout ce qui a du sens.
Quelques exemples :
For(i = 1, i <= 10, i = i + 0.1, Expr()); // Increment < 1 (100 iterations)
For(i = 10, i > 1, i--, Expr()); // Loop "backwards"
For(x = 2, x <= 10, x = 2, Expr()); // Eternal loop (better avoid these)
Re : Question simple sur les bouclesCela ne fonctionne pas car la boucle est placée dans la définition de la nouvelle colonne. Créez la colonne et remplissez ses valeurs dans des instructions distinctes, ou utilisez une formule de colonne.
Regardez ces trois exemples jsl qui devraient donner un résultat identique :
Names Default To Here(1);
dt = Current Data Table();
tr = N Rows(dt);
//1. Fill values with a For() loop
dt << New Column("TEST", "CHARACTER");
For(i = 1, i <= tr, i++,
:TEST[i] = If(:TIME[i] == "BASELINE" & :VALUE[i] > 3,
"YES",
"NO"
)
);
//2. Fill with For Each Row()
dt << New Column("TEST2", "CHARACTER");
For Each Row(:TEST2 = If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"));
//3. Use a column formula in TEST3
dt << New Column("TEST3",
"CHARACTER",
Formula(If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"))
);
Re : Question simple sur les bouclesLa tâche que vous souhaitez accomplir peut être accomplie de deux manières :
a) utilisez une propriété Formula pour la colonne :
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
Formula(
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;b) itérer avec une boucle
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for(ii=1, ii<=N Rows(dt), ii++,
:test[ii]=If(
(:TIME[ii] == "BASELINE" & :VALUE[ii] > 3)
,"YES"
,"NO"
)
);vous pouvez également utiliser For Each Row()
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for each row(
:test=If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
);
Re : Question simple sur les bouclesEncore une question:
La documentation JSL indique que les boucles for sont incrémentées en utilisant le 3ème argument de la fonction For. J'ai vu cela généralement écrit sous la forme i++. Je suppose que cela signifie incrémenter i de 1. Mais que dois-je faire si je souhaite incrémenter des valeurs inférieures à 1 ? Comment rédiger l’argumentation ?
La documentation JSL et l'outil d'index de script ne mentionnent pas comment procéder.
MerciRe : Question simple sur les bouclesVoici un script similaire que j'ai écrit pour accomplir la même tâche, mais en utilisant plutôt le Pour chaque ligne fonction. Cela ne fonctionne pas non plus.
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER",
For Each Row (dt,
If (
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;Toute aide appréciée