Buongiorno,
Qualcuno può aiutarmi? ...
vorrei sostituire i valori vuoti delle colonne numeriche con il valore medio della colonna.
ho provato questo
tt = Tabella dei dati correnti ();
RIEMPIRE = dt << ottenere i nomi delle colonne ( Numerico );
Per ( io = 1 , io <= N articoli ( RIEMPIRE ), i++,
FILL[i][dt << ottenere righe dove ( Manca ( RIEMPIRE[i][] ) )] = col significa (RIEMPIRE[i]);
);
grazie in anticipo
Gianpaolo
Non ho studiato il tuo codice in dettaglio, ma ho avuto la sensazione che tu stia facendo più lavoro del necessario. Per rendere le cose più leggibili, potresti prendere in considerazione l'utilizzo di funzioni come di seguito:
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),
);
);
Apri "Big Class", fai mancare alcune celle nelle colonne elencate, quindi provalo.
ciao Ian
innanzitutto grazie per l'aiuto e i suggerimenti. la tua sceneggiatura funziona molto bene
COSÌ.... Ho cercato di integrare il tuo script in uno più grande, in modo da ridurre e semplicemente DB.
qui l'intera opera
Nomi Predefinito A Qui( 1 );
clear globals();
// codice per scegliere tra tutte le tabelle aperte quale verrà selezionata per l'analisi
OpenDT = Lista();
For( i = 1, i <= N Tabella(), i++,
Inserisci in( OpenDT, Tabella dati( i ) )
);
dlgDT = Dialog( "Seleziona tabella dati per l'analisi", VList( selectDT = List Box( OpenDT ) ), HList( Button( "OK" ), Button( "Cancel" ) ) );
Mostra( dlgDT );
If( dlgDT["pulsante"] == 1,
Rimuovi da( dlgDT, N elementi( dlgDT ) );
Elenco di valutazione( dlgDT );
);
Tabella dati correnti( selectDT[1] );
// -----------------------------------------GUI ------ ------------------------------------//
cd = Dialogo Colonna(
Titolo( " Preelaborazione dati " ),
List= ColList( " Seleziona colonne >> ", MinCol( 1 ) ),
HList( " % di elementi vuoti nella colonna -> (0-100) ", mypercent1 = EditNumber( 50 ) ),
HList( " % di elementi stagnanti nella colonna -> (0-100) ", mypercent = EditNumber( 80 ) ),
VLista(
numeric = Check Box( "Colonne Numeriche - Assegna le celle mancanti con la media delle altre", 1 ),
carattere = Casella di controllo( "Carattere colonne - Imputa le celle mancanti con N/A", 1 ),
),
);
//dichiarazione di variabili
impute_num_col = cd["numerico"]; // imputa numeri
impute_char = cd["carattere"]; // imputa i caratteri
percento = cd["miopercentuale"];
percent1 = cd["mypercent1"];
mialista = cd["Lista"];
dt= selezionaDT[1];
delcols = {};
numRighe = nrighe(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 Mancante(column(dt,mylist[i])) >= numRows * percent1/100,
insert into(delcols, myList[i]);
);
);
);
nitems = N elementi( delcols );
nomecol = {};
listacolonne = {};
For( p = 1, p <= nitems, p++,
colname = Column( delcols[p] ) << Ottieni nome;
Insert Into( elenconomecol, nomecol(p) );
);
dt << cancella colonne (colnamelist);
//OK! Colonne Numerico - Imputa le celle mancanti con la media delle altre
If( impute_num_col == 1,
cc = dt << Ottieni i nomi delle colonne (continuo);
ncols = N elementi( cc );
For( i = 1, i <= ncols, i++,
valori = Colonna( dt, cc[i] ) << ottieni valori( 1 );
valori[Loc( Manca( valori ) )] = Media( valori );
Column( dt, cc[i] ) << setvalues( values, cc[i] );
);
);
// Carattere colonne - Imputa le celle mancanti con NA
If( impute_char == 1,
FILL = dt << ottiene i nomi delle colonne (Carattere);
For( i = 1, i <= N elementi( FILL ), i++,
FILL[i][dt << ottieni righe dove( Manca( FILL[i][] ) )] = "NA";
);
);
ma il problema è che l'ultima parte dello script (carattere #Columns - Imputa le celle mancanti con NA#)
non so perché... non funziona...
molto strano perchè lo stesso codice funziona se non è integrato nel lavoro sopra.
dt = Tabella dati corrente();
FILL = dt << ottiene i nomi delle colonne (Carattere);
For( i = 1, i <= N elementi( FILL ), i++,
FILL[i][dt << ottieni righe dove( Manca( FILL[i][] ) )] = "NA";
);
hai idea del perché sta succedendo... ?
grazie per la collaborazioneRi: come sostituire i valori vuoti delle colonne numeriche con il valore medio della colonnaSi prega di trovare un modo per farlo:
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);
Probabilmente è buona norma delineare i valori che gli sono stati imputati colorando le loro caselle.