53 Zeitspalten, einige leer und einige ausgefüllt. Wie schreibe ich eine Formel, die sicherstellt, dass die höchste ausgefüllte Spalte größer ist als die nächste ausgefüllte Spalte usw.Wenn ich Hunderte von Zeilen habe, ist jede Zeile ein separater Arbeitsschein. Jede Zeile kann bis zu 53 ausgefüllte Zeitspalten enthalten, in den meisten Fällen sind jedoch nur einige dieser Spalten ausgefüllt und die dazwischen liegenden sind leer.
Nehmen wir also für Zeile Nr. 1 an: Ich habe Spalte 1, Spalte 23 und Spalte 36 sind die einzigen Spalten, die einen Zeitstempel enthalten. Ich muss wissen, dass 36>23 und 23>1.
Für Zeile Nr. 2 haben alle Spalten Zeitstempel, daher muss ich wissen, dass [53>52,............,2>1].
Danke
Fiona
Erweiterte statistische ModellierungKonsumenten- und MarktforschungBetreff: 53 Zeitspalten, einige leer und einige gefüllt. Wie schreibe ich eine Formel, die sicherstellt, dass die am höchsten gefüllte Spalte > als die nächste gefüllte Spalte ist usw.Jarmo,
Das funktioniert auch sehr gut.
Ich habe nicht viel mit Matrizen gemacht, sieht aber interessant aus. Ich muss es durchgehen und sicherstellen, dass ich es verstehe.
Danke
Betreff: 53 Zeitspalten, einige leer und einige gefüllt. Wie schreibe ich eine Formel, die sicherstellt, dass die am höchsten gefüllte Spalte > als die nächste gefüllte Spalte ist usw.Hier ist eine mögliche Lösung mit Matrizen.Wenn keine Informationen über den Spaltennamen benötigt werden, kann er verkürzt werden, indem result_column und damit verbundene Berechnungen entfernt werden.
Names Default To Here(1);
dt = Current Data Table();
result_flag = [];
result_column = {};
For Each Row(dt,
m_all = dt[Row(), 0]; //get all values of row to matrix
m_values = m_all[Loc(m_all)]; //remove missing values;
start = Insert(m_values[1::N Items(m_values)-1], 0, 1); //shift right by 0 and remove last value
end = m_values;
//if we only want to know if any value is smaller than previous, we can just us any
Insert Into(result_flag, Any(end - start < 0)); //we could stop here if we don't want to know the column name
//but that doesn't tell us which column(s) breaks the "rule"
idx = Loc(end - start < 0); //indices of value matrix which break the rule -> will require checking for empty
If(N Items(idx) == 0,
Insert Into(result_column, "");
, //else
breaking_col = Min(Loc(m_all, m_values[Min(idx)])); //values which break rule, we can most likely just get the first index?
Insert Into(result_column, Column(dt, breaking_col) << get name);
);
);
dt << New Column("Flag", Numeric, Nominal, Values(result_flag));
dt << New Column("Column_Flag", Character, Nominal, Values(result_column));Könnte höchstwahrscheinlich auch als Formel verwendet werden, würde es aber höchstwahrscheinlich nicht empfehlen, da es ziemlich leicht zu brechen ist:
dt << New Column("Formula_Flag", Numeric, Nominal, Formula(
dt = Current Data Table();
m_all = Matrix(dt[Row(), 0]);
m_values = m_all[Loc(m_all)];
start = Insert(m_values[Index(1, N Items(m_values) - 1)], 0, 1);
end = m_values;
Any(end - start < 0);
));
Betreff: 53 Zeitspalten, einige leer und einige gefüllt. Wie schreibe ich eine Formel, die sicherstellt, dass die am höchsten gefüllte Spalte > als die nächste gefüllte Spalte ist usw.Das ist großartig, sogar besser als das, wonach ich gefragt habe, weil es mir genau sagt, wo die Bedingung nicht wahr ist.
Danke!
Betreff: 53 Zeitspalten, einige leer und einige gefüllt. Wie schreibe ich eine Formel, die sicherstellt, dass die am höchsten gefüllte Spalte > als die nächste gefüllte Spalte ist usw.Ich bin mir nicht ganz sicher, ob Sie das wollen, aber das folgende Skript scannt die Spalten und stellt sicher, dass alle Datumswerte gegenüber dem vorherigen Datum steigen.Wenn nicht, wird der Name der Spalte platziert, die ein früheres Datum als das vorherige Datum erkannt hat.
Names Default To Here( 1 );
dt = Current Data Table();
If( Try( dt:flag << get name, "" ) == "",
dt << New Column( "Flag", Character )
);
For( rowNum = 1, rowNum <= N Rows( dt ), rowNum++,
For( startCol = 1, startCol <= N Cols( dt ), startCol++,
If( Is Missing( Column( startCol )[rowNum] ) == 0,
holdVal = Column( startCol )[rowNum];
Break();
)
);
For( col = startCol + 1, col <= N Cols( dt ) - 1, col++,
If( Is Missing( Column( Col )[rowNum] ) == 0,
If( Column( Col )[rowNum] < holdVal,
dt:Flag[rowNum] = (Column( Col )) << get name;
holdVal = Column( col )[rowNum];
Break();
,
holdVal = Column( Col )[rowNum]
)
)
);
);Betreff: 53 Zeitspalten, einige leer und einige gefüllt. Wie schreibe ich eine Formel, die sicherstellt, dass die am höchsten gefüllte Spalte > als die nächste gefüllte Spalte ist usw.Nur um klarzustellen; Sie sollten alle korrekt sein, also denke ich, dass es am einfachsten ist, eine Markierungsspalte zu haben, die am Ende jeder Zeile eine "1" anzeigt, wo oben nicht der Fall ist.