Ciao a tutti.Ho creato questa funzione JSL per un'attività specifica, ma mi chiedevo se esiste un modo migliore per farlo.
Quello che voglio è un modo è se hai un vettore di indici, per creare un vettore indicatore di un collegamento specificato in cui il valore dell'elemento vettoriale è 1 per l'indice specificato e 0 altrimenti.PER ESEMPIO
[2, 3, 6] --> converti in vettore indicatore di lunghezza 10.
[0, 1, 1, 0, 0, 0, 1, 0, 0, 0]
Il caso d'uso è per selezionare sottoinsiemi di righe in una tabella di dati basata su più condizioni, dove per ogni condizione ottengo un vettore dei numeri di riga che soddisfano la condizione e voglio ottenere le righe che soddisfano tutte le condizioni.
// 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;
);
Quindi, per il caso d'uso, ad esempio, se ho tre condizioni, ottengo i numeri di riga nei vettori che soddisfano ciascuna condizione (v1, v2, v3), quindi lo farei
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);