bonjour,
quelqu'un peut m'aider? ...
je voudrais remplacer les valeurs vides des colonnes numériques par la valeur moyenne de la colonne.
j'ai essayé ça
dt = Tableau de données actuel ();
REMPLIR = dt << obtenir les noms de colonnes (Numérique);
Pour ( je = 1 , je <= N articles ( REMPLIR ), i++,
REMPLIR[i][dt << obtenir des lignes où ( Est manquant ( REMPLIR[i][] ) )] = signifie col (REMPLIR[i]);
);
Merci d'avance
Gianpaolo
Je n'ai pas étudié votre code en détail, mais j'ai eu le sentiment que vous faites plus de travail que nécessaire. Pour rendre les choses plus lisibles, vous pouvez envisager d'utiliser les fonctions ci-dessous :
NamesDefaultToHere(1);
// Only impute if more than n cells are missing
imputeContinuousCol =
Function({col, n}, {Default Local},
values = col << getValues;
missingValuePos = Loc(IsMissing(values));
if(NRow(missingValuePos) > n,
values[Loc(IsMissing(values))] = Mean(values);
col << setValues(values);
);
);
// Only impute if more than n cells are missing
imputeCharacterCol =
Function({col, n}, {Default Local},
values = col << getValues;
missingValuePos = Loc(values, "");
if(NRow(missingValuePos) > n,
values[Loc(values, "")] = "NA";
col << setValues(values);
);
);
// Data table . . .
dt = DataTable("Big Class.jmp");
// List of column names that satidfy your imputation criteria . . .
imputeList = {"name", "sex", "height"};
// Loop over this list, and impute if necessary
for (c=1, c<=NItems(imputeList), c++,
col = Column(dt, imputeList[c]);
if(
(col << getModelingType) == "Continuous",
imputeContinuousCol(col, 1),
(col << getDataType) == "Character",
imputeCharacterCol(col, 1),
);
);
Ouvrez 'Big Class', faites en sorte que certaines cellules manquent dans les colonnes répertoriées, puis essayez-le.
Salut Ian
tout d'abord merci pour votre aide et vos suggestions. ton script fonctionne très bien
Donc.... J'ai essayé d'intégrer votre script dans un plus gros, afin de réduire et simplement DB.
ici l'ensemble du travail
Noms par défaut à ici( 1 );
clear globals();
// code pour choisir parmi toutes les tables ouvertes celle qui sera sélectionnée pour l'analyse
OpenDT = Liste();
Pour( je = 1, je <= N Tableau(), je++,
Insérer dans( OpenDT, Table de données( i ) )
);
dlgDT = Dialog( "Sélectionner le tableau de données pour l'analyse", VList( selectDT = List Box( OpenDT ) ), HList( Button( "OK" ), Button( "Cancel" ) ) );
Afficher( dlgDT );
Si( dlgDT["bouton"] == 1,
Supprimer de( dlgDT, N éléments( dlgDT ) );
Liste d'évaluation( dlgDT );
);
Table de données actuelle( selectDT[1] );
// -----------------------------------------GUI ------ -----------------------------------//
cd = dialogue de colonne(
Titre( " Prétraitement des données " ),
List= ColList( " Sélectionner les colonnes >> ", MinCol( 1 ) ),
HList( " % d'éléments vides dans la colonne -> (0-100) ", mypercent1 = EditNumber( 50 ) ),
HList( " % d'éléments Stagnants dans la colonne -> (0-100) ", mypercent = EditNumber( 80 ) ),
VListe(
numeric = Check Box( "Columns Numeric - Imputer les cellules manquantes avec la moyenne des autres", 1 ),
caractère = Case à cocher( "Caractère des colonnes - Imputer les cellules manquantes avec N/A", 1 ),
),
);
//déclaration des variables
impute_num_col = cd["numérique"] ; // imputation des nombres
impute_char = cd["caractère"] ; // imputation de caractères
pourcentage = cd["monpourcentage"] ;
pourcentage1 = cd["monpourcent1"] ;
maliste = cd["Liste"] ;
dt= selectDT[1] ;
delcols = {} ;
numRows = nrows(dt);
for(i=1; maxi=Nitems(mylist), i<=maxi, i++,
if(nrows(loc(aslist(column(dt,mylist[i])<= numRows * percent/100,
insert into(delcols, myList[i]);
,
if(Col N Missing(column(dt,mylist[i])) >= numRows * percent1/100,
insert into(delcols, myList[i]);
);
);
);
nitems = N Items( delcols );
nomcol = {} ;
nom_col = {} ;
Pour( p = 1, p <= nitems, p++,
colname = Column( delcols[p] ) << Get Name;
Insert Into( listenomcol, nomcol(p) );
);
dt << supprimer les colonnes (colnamelist);
//D'ACCORD! Colonnes numériques - Impute les cellules manquantes avec la moyenne des autres
Si( impute_num_col == 1,
cc = dt << Obtenir les noms de colonne (continu);
ncols = N éléments( cc );
Pour( i = 1, i <= ncols, i++,
valeurs = Colonne( dt, cc[i] ) << obtenir valeurs( 1 );
valeurs[Loc( Is Missing( values ) )] = Mean( values );
Column( dt, cc[i] ) << setvalues( values, cc[i] );
);
);
// Caractère des colonnes - Imputer les cellules manquantes avec NA
Si( impute_char == 1,
REMPLIR = dt << obtenir les noms de colonne (Caractère);
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << get rows where( Is Missing( FILL[i][] ) )] = "NA" ;
);
);
mais le problème est que la dernière partie du script (caractère #Columns - Imputer les cellules manquantes avec NA#)
je ne sais pas pourquoi... ça ne marche pas...
très étrange car le même code fonctionne s'il n'est pas intégré dans le travail ci-dessus.
dt = table de données actuelle();
REMPLIR = dt << obtenir les noms de colonne (Caractère);
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << get rows where( Is Missing( FILL[i][] ) )] = "NA" ;
);
avez-vous une idée de pourquoi cela se produit... ?
merci pour la collaborationRe : comment remplacer les valeurs vides des colonnes numériques par la valeur moyenne de la colonneVeuillez trouver une façon de procéder :
NamesDefaultToHere(1);
// Make some test data
dt = NewTable("Test", NewColumn("Data", Numeric, Continuous, Formula(if(Mod(Row(), 2) == 0, RandomNormal()))));
dt << addRows(20);
dt << runFormulas;
Column(dt, "Data") << deleteFormula;
// Impute missing cells with the mean of the others
Wait(3);
col = Column(dt, "Data");
values = col << getValues;
values[Loc(IsMissing(values))] = Mean(values);
col << setValues(values);
C'est probablement une bonne pratique de délimiter les valeurs qui ont été imputées en colorant leurs cellules.