Gibt es eine bessere Möglichkeit, Spalten auszuwählen, die den Kriterien in einer anderen Spalte derselben Tabelle entsprechen?Das Skript am Ende dieses Beitrags macht im Grunde das, was ich möchte (d. h. Spalten finden, in denen ein Y-Wert 100 für Zeit = 0 ist), aber es generiert auch eine Protokollmeldung, die mir ein wenig unangenehm ist (nachdem ich getreten bin). in Fallen vor):
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.
Diese Meldung wird für jede Spalte, die erneut ausgewählt wird, in das Protokoll gedruckt, nachdem sie im Rahmen meiner Schleifenkonstruktion bereits einmal ausgewählt wurde. Als jemand, der relativ neu im Skripting ist, habe ich zwei Hauptsorgen:
- Ist diese Protokollmeldung etwas, das ich unbedingt vermeiden sollte, und werde ich auf Probleme stoßen? Ich werde schließlich größere Tabellen verarbeiten, sodass diese Protokollmeldung möglicherweise Hunderte Male für eine einzelne Skriptausführung gedruckt wird.
- Gibt es eine intelligentere Möglichkeit, alle Spalten in einer Tabelle zu finden, die für jede Zeile mit Zeit = 0 einen Y-Wert = 100 haben? (In meinem Fall werde ich Tabellen mit vielen Spalten verarbeiten, von denen einige Ergebnisse enthalten, die zum Zeitpunkt =0 auf 100 % relativ normalisiert sind. Das sind die Spalten, die mich interessieren.)
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
)
)
)
)
);
Ergebnisse teilen und kommunizierenBetreff: Bessere Möglichkeit, Spalten auszuwählen, die den Kriterien einer anderen Spalte in derselben Tabelle entsprechen?FWIW, das vermeidet die Teilmengentabelle, ist aber wahrscheinlich nicht viel schneller:
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));
);
Betreff: Bessere Möglichkeit, Spalten auszuwählen, die den Kriterien einer anderen Spalte in derselben Tabelle entsprechen?Danke nochmal. Die Unterteilung hat die Leistung auf meinem echten (großen) Tisch verbessert. Verbesserte Lösung unten veröffentlicht. Darüber hatte ich schon einmal nachgedacht, brauchte aber offensichtlich eine kurze Pause, um dorthin zu gelangen. Was ich jedoch noch nicht einmal in Betracht gezogen hatte, war, eine Liste von Spalten zu erstellen und Elemente iterativ zu entfernen. Vielen Dank auch dafür!
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( );
Betreff: Bessere Möglichkeit, Spalten auszuwählen, die den Kriterien einer anderen Spalte in derselben Tabelle entsprechen?Einige Ideen:
Sie könnten versuchen, die Tabelle bei time=0 zu unterteilen, bevor Sie mit Ihrer Schleife fortfahren. Das würde eine Ebene Ihrer for-Schleife entpacken.
Sie könnten eine Liste mit Spalten erstellen und die von Ihnen ausgewählten entfernen. Dann müssten Sie bei jeder nächsten Iteration nur die verbleibenden nicht ausgewählten Spalten durchlaufen.
Betreff: Bessere Möglichkeit, Spalten auszuwählen, die den Kriterien einer anderen Spalte in derselben Tabelle entsprechen?Sehr geschätzt! Ich denke, ich werde diese Schleife noch etwas weiter bearbeiten.
- Es gibt keinen Grund, die gesamte Tabelle zu durchlaufen, sobald die richtigen Spalten identifiziert wurden. (Bearbeiten: Das könnte mit meinem aktuellen Kenntnisstand etwas schwierig sein. In verschiedenen Y-Spalten können in verschiedenen Zeilen Werte fehlen. Ich muss alle Y-Spalten finden, in denen Zeit = 0 mit einem oder mehreren Y-Werten = 100 übereinstimmt.)
- Warum alle Zeilen durchlaufen und nicht nur diejenigen, in denen die Zeit tatsächlich Null ist?
Bearbeiten: Ich bin bei der vorgestellten Lösung geblieben. Sieht robust aus und wollte nicht noch mehr Zeit verschwenden. Aber Punkt Nr. 2, also nicht alle Zeilen der Tabelle zu durchlaufen, ist etwas, mit dem ich mich irgendwann befassen sollte und werde.
Betreff: Bessere Möglichkeit, Spalten auszuwählen, die den Kriterien einer anderen Spalte in derselben Tabelle entsprechen?Durch Hinzufügen von (1) nach << set selected wird die Fehlermeldung behoben. Anstatt es umzuschalten, definieren Sie den gewünschten Endzustand:
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)
)
)
)
)
);