Bonjour,
Je voudrais lister toutes les colonnes contenant une valeur spécifique dans l’une de leurs lignes et obtenir la liste de ces colonnes.
Je commence par lister toutes les colonnes de caractères dans une liste et j'y boucle pour vérifier si une valeur spécifique est contenue dans chacune des colonnes. Voici le code que j'ai utilisé. Une idée pour m'aider ? Merci d'avance
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 />
Beaucoup de solutions, merci pour ces idées !
Merci, cela fonctionne à merveille !
Quelques autres façons ci-dessous. Je suggérerais d'utiliser la solution de txnelson car elle est plus facile à comprendre.
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 vous rencontrez des « problèmes » avec la vitesse du script, vous pouvez voir si ce sujet pourrait vous aider. Si vous parcourez une table de données ou utilisez Recode ou utilisez Get
Je pense que cela pourrait faire ce que tu veux
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] )
)
);