Schleife? fehlende Daten aus der Arbeit mit mehreren Spalten und mit Spaltennamen zu zählen, die die Namen zwischen den Analysen ändern (Daten)Ich habe eine Frage, bei der ich hoffe, dass diese Community mir helfen kann. Ich möchte eine Spalte hinzufügen, in der die aufeinander folgenden Tage aufgeführt sind, die am letzten Tag und danach fehlen.
Ich möchte auch eine Spalte hinzufügen, die die Tage zählt, an denen das Ergebnis aus 7 Spalten höher als 0,02 ist.
Ich habe eine Lösung für beide gefunden, indem ich eine Reihe von if-Anweisungen verwendet habe, möchte aber erfahren, ob dies auf elegantere Weise möglich ist, möglicherweise mithilfe einer Schleife.
Schließlich ändern sich die Daten in der Tabelle von Woche zu Woche, daher möchte ich, dass diese Formel unabhängig von den Spaltennamen ist. Ist das möglich?
Ich habe meinen Lösungen eine ähnlich aussehende Datentabelle beigefügt.
Danke im Voraus
/ Markku
SkriptingRe: Schleife? fehlende Daten aus der Arbeit mit mehreren Spalten und mit Spaltennamen zu zählen, die die Namen zwischen den Analysen ändern (Daten)Hier ist die alternative Formel, die ich mir ausgedacht habe
If( Row() == 1,
start = 2;
end = 8;
);
count = end;
While( Is Missing( Column( count )[Row()] ) == 1 & count >= start, count-- );
end - count;
Re: Schleife? fehlende Daten aus der Arbeit mit mehreren Spalten und mit Spaltennamen zu zählen, die die Namen zwischen den Analysen ändern (Daten)Meine Lösung ist höchstwahrscheinlich etwas komplizierter als nötig (vollständiges Skript mit der Erstellung der Tabelle example_new). Diese Lösung erwartet, dass die interessierenden Spalten mit "Max (etwas") benannt werden (und sollte auch dann funktionieren, wenn mehr als sieben "Max (" - Spalten) vorhanden sind).
Diese beiden Formelspalten verlieren ihre Fähigkeit, Datenänderungen neu zu berechnen, und Sie müssen sie "manuell" aus dem roten Dreieck der Tabelle erneut ausführen, wenn sich Daten in der Datentabelle ändern:

Formeln für Spalten:
//modified idea based on of @txnelson solution
tempCol = dt << New Column("# last days missing_community", Numeric, Nominal,
Formula(
Local({
//get information on column names
dt = Current Data Table(),
colNames = dt << Get Column Names(String)
},
//get list of column names with only Max( in name
For(i = N Items(colNames), i > 0, i--,
If(!Contains(colNames[i], "Max("),
Remove From(colNames, i);
)
);
//get values on rows
//this might make a mistake if columns before Max( have are missing values
matLength = N Items(colNames) + 1;
rowValues = dt[Row(), 0][1::matLength];
count = 0;
//calculate missing values from the end of matrix and stop on first found value
While(Is Missing(rowValues[matLength]), count++; matLength--);
count;
)
)
);
dt << New Column("#days higher than 0,02_community", Numeric, Nominal,
Formula(
Local({
//get information on column names
dt = Current Data Table(),
colNames = dt << Get Column Names(String)
},
//get values on row and set values of colums without Max( in name to 0
rowVals = dt[Row(), 0];
For(i = N Items(colNames), i > 0, i--,
If(!Contains(colNames[i], "Max("),
rowVals[i] = 0;
)
);
//create matrix with 0 and 1 based on if value is over 0.02
rowVals_over = rowVals > 0.02;
//get sum of previous matris to calculate Max( columns with values over 0.02
Sum(rowVals_over);
);
)
);
Re: Schleife? fehlende Daten aus der Arbeit mit mehreren Spalten und mit Spaltennamen zu zählen, die die Namen zwischen den Analysen ändern (Daten)sehr geehrter @ Markku ,
Ich habe auch Schwierigkeiten, dynamische Skripte zu erstellen und sie in eine Spaltenformel zu analysieren. In der Vergangenheit hatte ich eine ähnliche Situation wie Sie, in der sich die Anzahl der wiederholten Messungen (in Ihrem Fall die Chargen wiederholen sich jeden Tag) von einer Beobachtung (Charge) zur nächsten ändern konnte.
Meine Lösung mag für Ihre Bedürfnisse etwas rau aussehen, aber ich denke, es sollte funktionieren.
Bitte überprüfen Sie vor der Verwendung, ob es für verschiedene Szenarien robust ist.
Führen Sie bei geöffneter Datentabelle dieses Skript aus und überprüfen Sie die Ergebnisse.
Names Default To Here( 1 );
dt = Current Data Table();
// get list of columns
Cols = dt << get column names ( Continuous );
maxlist = {};
For( i = 1, i <= N Items( cols ), i++,
If( Contains( cols[i], "Max" ),
Insert Into( maxlist, cols[i] )
)
);
dt2 = dt << Stack(
columns(maxlist ),
Source Label Column( "Time" ),
Stacked Data Column( "Data" )
);
dt2 << Sort(
By( :Batch#, :Time ),
Order( Ascending, Descending ),
replace table
);
dt2 <<NEW column=""> :Index2 ) << delete rows ();
dt3 = dt2 << Summary(
Group( :Batch# ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 ),
);
close (dt2, no save);
dt3:N Rows << set name ("No of last days missing");
dt << new column ("No of last days missing", set each value (0));
dt << Update(
With( dt3 ),
Match Columns( :Batch# = :Batch# )
);
close (dt3, no save);
//
dt5 = dt << Stack(
columns(maxlist ),
Source Label Column( "Time" ),
Stacked Data Column( "Data" )
);
dt5 << select where (ismissing (:Data)) << delete rows;
dt5 << select where (:Data<=0.02) << delete rows;
dt6 = dt5 << Summary(
Group( :Batch# ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
close (dt5, no save);
dt6:N Rows << set name ("Days over 0.02");
dt << new column("Days over 0.02", set each value(0));
dt<< Update(
With( dt6 ),
Match Columns( :Batch# = :Batch# )
);
close (dt6, no save);
<BR /></NEW>
Lassen Sie uns wissen, ob es funktioniert,
Ron