Guten Morgen,
kann mir jemand helfen? ...
Ich möchte leere Werte von numerischen Spalten durch ersetzen der durchschnittliche Spaltenwert.
Ich habe das versucht
dt = Aktuelle Datentabelle ();
FÜLLEN = dt << Spaltennamen erhalten ( Numerisch );
Für ( ich = 1 , ich <= N Artikel ( FÜLLEN ), i++,
FILL[i][dt << Holen Sie sich Zeilen wo ( Wird vermisst ( FÜLLEN[i][] ) )] = col bedeuten (FÜLLEN[i]);
);
vielen Dank im Voraus
Gianpaolo
Ich habe Ihren Code nicht im Detail studiert, hatte aber das Gefühl, dass Sie mehr Arbeit machen, als Sie brauchen. 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 „Große Klasse“, lassen Sie einige Zellen in den aufgelisteten Spalten fehlen und probieren Sie es aus.
Hallo Jan
erstmal danke für eure hilfe und vorschläge. Ihr Skript funktioniert sehr gut
So.... Ich habe versucht, Ihr Skript in ein größeres zu integrieren, um DB zu reduzieren und zu vereinfachen.
hier die ganze arbeit
Namen standardmäßig bis hierher ( 1 );
Global löschen ();
// Code, um aus allen geöffneten Tabellen auszuwählen, welche für die Analyse ausgewählt werden
OpenDT = Liste();
For( i = 1, i <= N Tabelle(), i++,
Einfügen in ( OpenDT, Datentabelle ( i ) )
);
dlgDT = Dialog( "Datentabelle zur Analyse auswählen", VList( selectDT = List Box( OpenDT ) ), HList( Button( "OK" ), Button( "Cancel" ) ) );
Show( dlgDT );
If(dlgDT["button"] == 1,
Entfernen aus ( dlgDT, N Elemente ( dlgDT ) );
Auswertungsliste( dlgDT );
);
Aktuelle Datentabelle (selectDT[1]);
// -----------------------------------------GUI ------ -----------------------------------//
cd = Spaltendialog (
Title( " 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(
numeric = Check Box( "Columns Numeric - Ersetze fehlende Zellen mit dem Mittelwert der anderen", 1 ),
character = Check Box( "Columns character - Fehlende Zellen mit N/A ersetzen", 1 ),
),
);
// Deklaration von Variablen
impute_num_col = cd["numerisch"]; // Zahlen imputieren
impute_char = cd["Zeichen"]; // Zeichen eingeben
Prozent = cd["meinprozent"];
Prozent1 = cd["meinProzent1"];
meineliste = 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 * percent1/100,
insert into(delcols, myList[i]);
);
);
);
nitems = N Items( delcols );
Spaltenname = {};
Spaltenliste = {};
For( p = 1, p <= Elemente, p++,
colname = Column( delcols [p] ) << Get Name;
Einfügen in (Spaltenliste, Spaltenname(p));
);
dt << Spalten löschen (colnamelist);
//OK! Spalten Numerisch - Ersetzen Sie fehlende Zellen mit dem Mittelwert der anderen
Wenn ( impute_num_col == 1,
cc = dt << Spaltennamen abrufen (Kontinuierlich);
ncols = N Elemente ( cc );
For( i = 1, i <= ncols, i++,
Werte = Column( dt, cc[i] ) << get values( 1 );
Werte [Loc (fehlt (Werte))] = Mittelwert (Werte);
Column( dt, cc[i] ) << setvalues( values, cc[i] );
);
);
// Spaltenzeichen - Ersetzen Sie fehlende Zellen mit NA
Wenn ( impute_char == 1,
FILL = dt << Spaltennamen abrufen ( Character );
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << Zeilen abrufen wo( Is Missing( FILL[i][] ) )] = "NA";
);
);
aber das Problem ist, dass der letzte Teil des Skripts (#Spaltenzeichen - Fehlende Zellen mit NA# imputieren)
keine ahnung warum geht nicht....
sehr seltsam, weil derselbe Code funktioniert, wenn er nicht in den obigen Job integriert ist.
dt = Aktuelle Datentabelle ();
FILL = dt << Spaltennamen abrufen ( Character );
For( i = 1, i <= N Items( FILL ), i++,
FILL[i][dt << Zeilen abrufen wo( Is Missing( FILL[i][] ) )] = "NA";
);
hast du eine ahnung warum das passiert... ?
danke für die zusammenarbeitBetreff: wie man leere Werte von numerischen Spalten durch den durchschnittlichen Spaltenwert ersetztBitte 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 imputierten Werte durch Einfärben ihrer Zellen abzugrenzen.