Hola,
Me gustaría enumerar todas las columnas que contienen un valor específico en cualquiera de sus filas y obtener la lista de esas columnas.
Comienzo enumerando todas las columnas de caracteres en una lista y hago un bucle para verificar si un valor específico está contenido en cada una de las columnas. Aquí está el código que utilicé. ¿Alguna idea de cómo ayudarme? Gracias de antemano
col = dt << get column names( character );
nc = N Items( col );
colList = {};
For( i = 1, i <= nc, i++,
If(Contains (as column(dt,col[i]) ,"null"),
Insert Into( colList, col[i] ))
);<BR />
Creo que esto podría hacer lo que quieras
Names Default To Here( 1 );
dt = current data table();
col = dt << get column names( character );
nc = N Items( col );
colList = {};
For( i = 1, i <= nc, i++,
If( N Rows( dt << get rows where( As Column( dt, col[i] ) == "null" ) ) > 0,
Insert Into( colList, col[i] )
)
);Un par de formas más a continuación. Sugeriría usar la solución de txnelson ya que es más fácil de entender.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(5),
New Column("Column 1", Character, "Nominal", Set Values({"null", "a", "s", "d", "vb"})),
New Column("Column 2", Character, "Nominal", Set Values({"a", "a", "a", "a", "a"})),
New Column("Column 3", Character, "Nominal", Set Values({"a", "a", "a", "a", "a"})),
New Column("Column 4", Character, "Nominal", Set Values({"null", "a", "a", "a", "a"})),
New Column("Column 5", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4, 5])),
New Column("Column 6", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4, 5])),
New Column("Column 7", Character, "Nominal", Set Values({"a", "a", "a", "null", "a"}))
);
//using Loc and matrix subscripting
char_col_names = dt << Get Column Names(character);
null_cols = {};
For(i = 1, i <= N Items(char_col_names), i++,
If(N Items(Loc(dt[0, char(char_col_names[i])], "null")) > 0,
Insert Into(null_cols, char_col_names[i]);
);
);
Show(null_cols);
//Using list flattening and loc with "2d" matrix
//List flattening function from here https://community.jmp.com/t5/Discussions/JSL-Question-How-to-flatten-quot-a-list-of-lists/td-p/56535
rec = Function({ll},
{i},
If(Is List(ll),
For(i = 1, i <= N Items(ll), i++,
If(!Is List(ll[i]),
Insert Into(llnew, ll[i]), //else
rec(ll[i])
)
)
)
);
flatten = Function({ulist},
{llnew = {}},
rec(ulist);
llnew;
);
col_names = dt << Get Column Names();
//https://community.jmp.com/t5/JSL-Cookbook/Using-Loc-with-a-2D-Matrix/ta-p/195207
null_loc = Loc(flatten(dt[0, col_names ]), "null") - 1;
column_loc = Mod(null_loc, N Items(col_names )) + 1;
Show(col_names[column_loc]);Si tiene "problemas" con la velocidad de la secuencia de comandos, puede ver si este tema podría ayudar ¿Debería recorrer una tabla de datos o usar Recode o usar Get
¡Gracias, esto funciona como un encanto!