Guten Morgen,
kann mir jemand helfen? ...
Ich möchte leere Werte numerischer Spalten durch ersetzen der durchschnittliche Spaltenwert.
Ich habe es versucht
dt = Aktuelle Datentabelle ();
FILL = dt << Spaltennamen abrufen (Numerisch);
Für ( ich = 1 , ich <= N Artikel ( FILL ), i++,
FILL[i][dt << Holen Sie sich Zeilen wo ( Wird vermisst ( FILL[i][] ) )] = col bedeuten (FILL[i]);
);
Dank im Voraus
Gianpaolo
Ich habe Ihren Code nicht im Detail studiert, hatte aber das Gefühl, dass Sie mehr Arbeit leisten, als nötig ist. Um die Lesbarkeit zu verbessern, können Sie die folgenden Funktionen verwenden:
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),
);
);
Öffnen Sie „Big Class“, lassen Sie einige Zellen in den aufgelisteten Spalten fehlen und probieren Sie es dann aus.
Hallo Ian
zunächst einmal vielen Dank für eure Hilfe und Anregungen. Dein Skript funktioniert sehr gut
Also.... Ich habe versucht, Ihr Skript in ein größeres zu integrieren, um DB zu reduzieren und zu vereinfachen.
hier das gesamte Werk
Namen standardmäßig hier( 1 );
klare Globals();
// Code, um aus allen geöffneten Tabellen auszuwählen, welche für die Analyse ausgewählt wird
OpenDT = List();
For( i = 1, i <= N Table(), i++,
Einfügen in (OpenDT, Datentabelle (i))
);
dlgDT = Dialog( "Datentabelle zur Analyse auswählen", VList( selectDT = List Box( OpenDT ) ), HList( Button( "OK" ), Button( "Abbrechen" ) ) );
Show( dlgDT );
If( dlgDT["button"] == 1,
Remove From( dlgDT, N Items( dlgDT ) );
Evaluierungsliste( dlgDT );
);
Aktuelle Datentabelle( selectDT[1] );
// ---------------------------GUI ------ -----------------------------------//
cd = Spaltendialog(
Titel( „Datenvorverarbeitung“),
List= ColList( " Spalten auswählen >> ", MinCol( 1 ) ),
HList( " % der leeren Elemente in der Spalte -> (0-100) ", mypercent1 = EditNumber( 50 ) ),
HList( " % der stagnierenden Elemente in der Spalte -> (0-100) ", mypercent = EditNumber( 80 ) ),
VListe(
numerisch = Kontrollkästchen („Spalten numerisch – Fehlende Zellen mit dem Mittelwert der anderen unterstellen“, 1 ),
Zeichen = Kontrollkästchen („Spaltenzeichen – Fehlende Zellen mit N/A unterstellen“, 1 ),
),
);
//Deklaration von Variablen
impute_num_col = cd["numeric"]; // Numerik unterstellen
impute_char = cd["character"]; // Zeichen unterstellen
Prozent = cd["meinProzent"];
Prozent1 = cd["meinProzent1"];
mylist = 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 * Prozent/100,
insert into(delcols, myList[i]);
,
if(Col N Missing(column(dt,mylist[i])) >= numRows *cent1/100,
insert into(delcols, myList[i]);
);
);
);
nitems = N Items( delcols );
Spaltenname = {};
colnamelist = {};
For( p = 1, p <= nitems, p++,
colname = Column( delcols[p] ) << Get Name;
Einfügen in( colnamelist, colname(p) );
);
dt << Spalten löschen (colnamelist);
//OK! Spalten Numerisch – Fehlende Zellen werden mit dem Mittelwert der anderen berechnet
If( impute_num_col == 1,
cc = dt << Spaltennamen abrufen (kontinuierlich);
ncols = N Items( cc );
For( i = 1, i <= ncols, i++,
Werte = Spalte( dt, cc[i] ) << get value( 1 );
Werte[Loc( fehlt( Werte))] = Mittelwert(Werte);
Column( dt, cc[i] ) << setvalues( Values, cc[i] );
);
);
// Spaltenzeichen – Fehlende Zellen mit NA imputieren
If( impute_char == 1,
FILL = dt << Spaltennamen abrufen (Zeichen);
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << Zeilen abrufen where( Is Missing( FILL[i][] ) )] = "NA";
);
);
aber das Problem ist, dass der letzte Teil des Skripts (#Columns-Zeichen – Fehlende Zellen mit NA# imputieren)
Ich weiß nicht warum... funktioniert nicht...
Sehr seltsam, weil derselbe Code funktioniert, wenn er nicht in den obigen Job integriert ist.
dt = Aktuelle Datentabelle();
FILL = dt << Spaltennamen abrufen (Zeichen);
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << Zeilen abrufen where( Is Missing( FILL[i][] ) )] = "NA";
);
Hast du eine Ahnung, warum das passiert? ?
Danke für die ZusammenarbeitBetreff: So ersetzen Sie leere Werte numerischer Spalten durch den durchschnittlichen SpaltenwertBitte finden Sie eine Möglichkeit, dies zu tun:
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);
Wahrscheinlich ist es eine gute Praxis, die zugeschriebenen Werte durch Einfärben ihrer Zellen abzugrenzen.