Hallo zusammen.Ich habe diese JSL-Funktion für eine bestimmte Aufgabe erstellt, aber ich habe mich gefragt, ob es einen besseren Weg gibt, dies zu tun.
Was ich möchte, ist eine Möglichkeit, wenn Sie einen Vektor von Indizes haben, einen Indikatorvektor eines angegebenen Links zu erstellen, wobei der Wert des Vektorelements für den angegebenen Index 1 und andernfalls 0 ist.Z.B
[2, 3, 6] --> in Indikatorvektor der Länge 10 umwandeln.
[0, 1, 1, 0, 0, 0, 1, 0, 0, 0]
Der Anwendungsfall besteht darin, Teilmengen von Zeilen in einer Datentabelle basierend auf mehreren Bedingungen auszuwählen, wobei ich für jede Bedingung einen Vektor der Zeilennummern erhalte, die die Bedingung erfüllen, und ich möchte die Zeilen erhalten, die alle Bedingungen erfüllen.
// Loc Inverse Function
// This function converts a vector of positive integers (locvals) into an
// indicator vector of a specified length, n, with the values
// v[I] = 1 if I is in locvals, and 0 otherwise
// example
// Loc Inverse(6, [1,3])
// returns
// [1, 0, 1, 0, 0, 0]
*/
Loc Inverse = Function( {n, locvals},
v = J( n, 1, 0 );
v[locvals] = 1;
v;
);
Wenn ich beispielsweise drei Bedingungen habe, erhalte ich für den Anwendungsfall die Zeilennummern in Vektoren, die jede Bedingung erfüllen (v1, v2, v3), also würde ich dies tun
dt=current data table();
Loc Inverse = Function( {n, locvals},
v = J( n, 1, 0 );
v[locvals] = 1;
v;
);
// ...
// code to get v1, v2, v3
// ...
rowindicator1=Loc Inverse(n rows(dt), v1);
rowindicator2=Loc Inverse(n rows(dt), v2);
rowindicator3=Loc Inverse(n rows(dt), v3);
meet_all_conditions_indicator = rowindicator1 & rowindicator2 & rowindicator3;
rows_that_meet_all_conditions = Loc(meet_all_conditions_indicator);