supprimer les colonnes catégorielles presque videsQuelqu'un peut m'aider?
D'une base de données, je dois supprimer les colonnes catégorielles avec un certain pourcentage de caractères manquants et en même temps, je voudrais supprimer les colonnes numériques avec un pourcentage de valeurs stagnantes (pas nécessaire 100%).
Merci.Félix
Re : supprimer les colonnes catégorielles presque videsParfait merci.
Félix
Re : supprimer les colonnes catégorielles presque videsOui, tout dépend de la façon dont vous l'avez configuré. La première vérification consiste à trouver la valeur la plus courante dans chaque colonne et à déterminer si elle est supérieure ou inférieure au pourcentage de seuil. Malheureusement, une valeur manquante n'est pas une valeur, elle ne peut donc pas être la plus courante. C'est pourquoi cela ne fonctionne pas sur les colonnes numériques. Cela fonctionne sur les colonnes de caractères b/c "" est à la fois manquant et une valeur de chaîne vide.
J'espère que cela aide à expliquer les choses.
Si vous voulez plus de granularité, exécutez simplement plusieurs boucles avec des pourcentages différents en utilisant différentes stratégies.Re : supprimer les colonnes catégorielles presque videsSalut msharp merci pour votre réponse. Posons une autre question. La variable de pourcentage fonctionne-t-elle à la fois sur les colonnes catégorielles et numériques ? Si oui, puis-je avoir deux valeurs différentes pour les cas manquants et stagnants ?
Désolé pour la question peut-être stupide mais je ne suis pas expert en langage jsl.
Félix
Re : supprimer les colonnes catégorielles presque videsIl suffit de combiner les stratégies. Quelque chose comme:
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
if(nrows(loc(aslist(column(dt,i)<<GETASMATRIX> numRows * percent/100,
insert into(delcols, i);
,
if(Col N Missing(column(dt,i)) > numRows * percent/100,
insert into(delcols, i);
);
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols)); </GETASMATRIX>Re : supprimer les colonnes catégorielles presque videsSalut
J'ai essayé votre script sur le deuxième tableau ci-dessous et le résultat est ici.
Comme vous pouvez le voir, il a pu supprimer presque toutes les colonnes souhaitées, mais pas la seconde (col2).Comment puis-je faire pour l'enlever aussi?
Merci Felice


Re : supprimer les colonnes catégorielles presque videsvous pourrez peut-être utiliser la méthode que vous avez publiée auparavant, mais avec le mode de la colonne pour quelque chose de moins de 100 %
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
if(nrows(loc(aslist(column(dt,i)<<getasmatrix),mode(column(dt,i)<<getasmatrix))) > numRows * percent/100,
insert into(delcols, i);
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols));
Re : supprimer les colonnes catégorielles presque videsJe pense que tu cherches aussi quelque chose comme ça :
Ce qui supprimera une colonne numérique si toutes les données ne sont qu'une seule valeur.
Names Default To Here( 1 );
dt = Current Data Table();
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
col = column(dt, i);
try(summarize(dt, max = max(col), min = min(col));
if((max == min) | (ismissing(max)),
insertinto(delcols, i);
)
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols));Re : supprimer les colonnes catégorielles presque videsUne autre méthode, je crois un peu plus robuste.
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
col = column(dt, i);
nmissing = col N missing(col);
if(nmissing > numRows * percent/100,
insert into(delcols, i);
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols));
Re : supprimer les colonnes catégorielles presque videsVoici un script rapide et sale qui se débarrasse des colonnes avec moins d'un pourcentage spécifié de données
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
colList = dt << get column names( character, string );
NumRows = N Rows( dt );
For( i = N Items( colList ), i >= 1, i--,
If( Col Number( Column( dt, i ) ) / NumRows * 100 < percent,
dt << delete columns( colList[i] )
)
);