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élice
Re : supprimer les colonnes catégorielles presque videsParfait merci.
Heureux
Re : supprimer les colonnes catégorielles presque videsOuais, tout dépend de la façon dont vous l'avez configuré. La première vérification consiste à rechercher 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 et 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 car "" est à la fois manquant et une valeur de chaîne vide.
J'espère que cela aide à expliquer les choses.
Si vous souhaitez plus de granularité, exécutez simplement plusieurs boucles avec différents pourcentages 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 cette question peut-être stupide mais je ne suis pas expert en langage JSL.
Heureux
Re : supprimer les colonnes catégorielles presque videsCombinez simplement 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, insérer dans (delcols, i); , if(Col N Missing(column(dt,i)) > numRows * percent/100, insert into(delcols, i); ); ); ); if(nitems(delcols) > 0, dt << supprimer les colonnes (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 deuxième (col2). Comment puis-je faire pour le supprimer également ?
Merci Félice


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)< numRows * percent/100, insérer dans (delcols, i); ); ); if(nitems(delcols) > 0, dt << supprimer les colonnes (delcols));
Re : supprimer les colonnes catégorielles presque videsJe pense que vous recherchez également quelque chose comme ceci :
Ce qui supprimera une colonne numérique si toutes les données ne contiennent 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 légèrement 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 supprime les colonnes contenant 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] )
)
);