Une meilleure façon de sélectionner des colonnes correspondant aux critères d'une autre colonne du même tableau ?Le script à la fin de cet article fait essentiellement ce que je veux (c'est-à-dire trouver des colonnes où une valeur Y est de 100 pour le temps = 0), mais il génère également un message de journal qui me met un peu mal à l'aise (après avoir fait un pas dans les pièges avant) :
A message with an empty Boolean argument enabled an option that was already enabled. That option remains enabled. In previous versions of JMP, this would have disabled the option.
Ce message est imprimé dans le journal pour chaque colonne qui est à nouveau sélectionnée, après qu'elle ait déjà été sélectionnée une fois dans le cadre de la construction de ma boucle. En tant que personne relativement nouvelle dans le domaine des scripts, j'ai deux préoccupations principales :
- Ce message de journal est-il quelque chose que je devrais absolument éviter et vais-je rencontrer des problèmes ? Je vais éventuellement traiter des tables plus grandes, de sorte que ce message de journal peut être imprimé des centaines de fois pour une seule exécution de script.
- Existe-t-il un moyen plus intelligent de rechercher toutes les colonnes d'un tableau ayant une valeur Y = 100 pour chaque ligne où temps = 0 ? (Dans mon cas, je traiterai des tableaux avec de nombreuses colonnes, certaines contenant des résultats normalisés à 100 % rel. au temps =0. Ce sont les colonnes qui m'intéressent.)
Names Default To Here( 1 );
// table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, 100, 200, 325, 490] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [100, 50, 33, 0, 100, 113, 150, 94] ),
)
);
// selecting columns where for :time == 0 a Y-value == 100 is found
For( i = 1, i <= N Row( dt ), i++,
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected
)
)
)
)
);
Partager et communiquer les résultatsRe : Meilleur moyen de sélectionner des colonnes correspondant aux critères d'une autre colonne du même tableau ?FWIW, cela évite la table des sous-ensembles, mais n'est probablement pas beaucoup plus rapide :
Names Default To Here( 1 );
// table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, 100, 200, 325, 490] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [100, 50, 33, 0, 100, 113, 150, 94] ),
)
);
// Rows that have time = 0
r0 = dt << getRowsWhere(:time == 0);
// Loop over other columns (assumes time is in the first column)
for(c=2, c<=NCol(dt), c++,
if(Contains(Column(dt, c)[r0], 100), Column(dt, c) << setSelected(1));
);
Re : Meilleur moyen de sélectionner des colonnes correspondant aux critères d'une autre colonne du même tableau ?Merci encore. Le sous-ensemble a amélioré les performances sur ma vraie (grande) table. Solution améliorée publiée ci-dessous. J'y avais déjà pensé, mais j'avais évidemment besoin d'une petite pause pour y arriver. Ce que je n'avais même pas envisagé, c'était de créer une liste de colonnes et de supprimer des éléments de manière itérative. Merci aussi pour ça !
Names Default To Here( 1 );
// new table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98, 0.7, ., 0.83, 0.4] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, ., 200, 325, 490, 100, 330, 540, 213] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75, 8.3, 9.7, 6.4, 5.2] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [., 50, 33, 0, 100, 113, 150, 94, 100, 66, 37, 12] ),
)
);
// finding and selecting Y columns where for any :time == 0 a value of 100 is found in the same row
dt << Select Where( dt:time == 0 );
dtTemp = dt << Subset ( Selected Rows, Selected Columns Only( 0 ) );
For( i = 1, i <= N Row( dtTemp ), i++,
For( j = 1, j <= N Col( dtTemp ), j++,
If( Column( dtTemp, j )[i] == 100,
Column( dt, j ) << Set Selected( 1 ),
)
)
);
Close( dtTemp, no save );
dt << Clear Select( );
Re : Meilleur moyen de sélectionner des colonnes correspondant aux critères d'une autre colonne du même tableau ?Quelques idées:
Vous pouvez essayer de sous-ensembler la table sur time=0 avant de poursuivre votre boucle. Cela déballerait une couche de votre boucle for.
Vous pouvez créer une liste de colonnes et supprimer celles que vous avez sélectionnées. Ensuite, pour chaque itération suivante, vous n'aurez qu'à parcourir les colonnes non sélectionnées restantes.
Re : Meilleur moyen de sélectionner des colonnes correspondant aux critères d'une autre colonne du même tableau ?Très appréciée! Je pense que je vais modifier cette boucle un peu plus loin.
- Il n'y a aucune raison de parcourir l'intégralité du tableau une fois que les colonnes correctes ont été identifiées. (Edit : cela pourrait être un peu difficile à faire avec mon niveau de compétence actuel. Différentes colonnes Y peuvent avoir des valeurs manquantes dans différentes lignes. Je dois trouver toutes les colonnes Y où time = 0 correspond à une ou plusieurs valeurs Y = 100.)
- Pourquoi parcourir toutes les lignes et pas seulement celles où le temps est en réalité nul ?
Edit : je suis resté avec la solution présentée. Il a l'air robuste et je ne voulais pas utiliser encore plus de temps. Mais la puce n°2, c'est-à-dire ne pas parcourir toutes les lignes du tableau, est quelque chose que je devrais et que j'examinerai probablement à un moment donné.
Re : Meilleur moyen de sélectionner des colonnes correspondant aux critères d'une autre colonne du même tableau ?L'ajout de (1) après << set selected prend en charge le message d'erreur. Au lieu de l'activer, vous définissez l'état final souhaité :
For( i = 1, i <= N Row( dt ), i++,
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected(1)
)
)
)
)
);