Ersetzen Sie fehlende Werte durch 0Hallo,
Ich versuche, alle fehlenden Werte in einer Datentabelle durch 0 zu ersetzen.Das folgende Skript funktioniert nicht.Ich verwende JMP 13. Gibt es eine andere Möglichkeit, dies zu tun?
dt <SPAN class="token operator">=</SPAN> <SPAN class="token function">Current Data Table</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
nc <SPAN class="token operator">=</SPAN> dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> get column names</SPAN><SPAN class="token punctuation">(</SPAN> Numeric <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
<SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> i <SPAN class="token operator">=</SPAN> <SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN> i <SPAN class="token operator"><=</SPAN> <SPAN class="token function">N Items</SPAN><SPAN class="token punctuation">(</SPAN> nc <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> i<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,</SPAN>
nc<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN>dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> get rows where</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token function">Is Missing</SPAN><SPAN class="token punctuation">(</SPAN> nc<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token punctuation">)</SPAN> <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">=</SPAN> <SPAN class="token number">0</SPAN>
<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
Danke!
Betreff: Fehlende Werte durch 0 ersetzen>> Kann ich fehlende Werte in der numerischen Spalte durch die Zeichenfolge „N/A“ ersetzen?
Verwenden Sie dazu Werteetiketten. Klicken Sie mit der rechten Maustaste auf die Spaltenüberschrift, gehen Sie zu den Spalteneigenschaften und wählen Sie Wertebeschriftungen aus. Geben Sie dann einen Punkt in den Wert und N/A in das Beschriftungsfeld ein, wie unten gezeigt. Klicken Sie dann auf „Hinzufügen“ und dann auf „OK“.
Um ein Skript zu erstellen, folgen Sie der Protokollaufzeichnung der obigen Schritte ...
Datentabelle( "DT-Name" ):Spalte 904 << Wertebeschriftungen( {"." = "N/A"} ) << Wertebeschriftungen verwenden( 1 );

Betreff: Fehlende Werte durch 0 ersetzenin Kann ich fehlende Werte in der numerischen Spalte durch die Zeichenfolge „N/A“ ersetzen?
Betreff: Fehlende Werte durch 0 ersetzenLieber Ian und Craige,
Vielen Dank für Ihre Einsendungen. Ich habe einige vorläufige Tests durchgeführt und die Lösung von Ian ist dafür mehr als viermal schneller als Recode und die Lösung von Craige ist fast zehnmal schneller. Wenn jemand alle drei Lösungen vergleichen möchte, versuchen Sie Folgendes:
//Recode solution
nr = 10000; // Number of rows
nc = 10000; // Number of columns
nm = 0.9; // Proportion of missing values
// Make a table and inject some missing values
mat = J(nr*nc, 1, RandomNormal());
mat[RandomIndex(nr*nc, nr*nc*nm)] = .;
dt = AsTable(Shape(mat, nr, nc));
dt << setName("Data with some missingness");
replaceMissingStart = HP Time();
// replace missings with zeros
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
col = Column(dt,nc[i]);
colname = col << getname();
Eval(Parse(EvalInsert("\[
dt << Recode Column(
:Name("^colname^"),
{Map Value( _rcOrig, {., 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :Name("^colname^") )
);
]\")));
//Code from the Community
//Column( nc[i] )[dmdt << get rows where( Is Missing( As Column( nc[i] ) ) )] = 0;
// standardize column attributes, change all to nominal
//col << Set Modeling Type( "Nominal" )
);
replaceMissingStop = HP Time();
totalReplaceTime = replaceMissingStop-replaceMissingStart;
show(totalReplaceTime/1000000);
Russ Wolfinger hatte erwähnt, dass er glaubte, Matrizen würden das Problem schneller lösen, ich denke, das haben Sie beide auch gedacht!
Betreff: Fehlende Werte durch 0 ersetzenKombinieren von Lösungen mit subskriptiver Datentabelle ...
nr = 10000; // Number of rows
nc = 10000; // Number of columns
nm = 0.9; // Proportion of missing values
// Make a table and inject some missing values
mat = J(nr*nc, 1, RandomNormal());
mat[RandomIndex(nr*nc, nr*nc*nm)] = .;
dt = AsTable(Shape(mat, nr, nc));
dt << setName("Data with some missingness");
replaceMissingStart = HP Time();
nc = dt << get column names( Numeric );
mat = dt[0,nc];
mat[Loc(mat, .)] = 0;
dt[0,nc] = mat;
replaceMissingStop = HP Time();
totalReplaceTime = replaceMissingStop-replaceMissingStart;
show(totalReplaceTime/1000000);
Ungefähr 10 Sekunden.
Betreff: Fehlende Werte durch 0 ersetzenFWIW, dieser Ansatz könnte besser sein. Für 10.000 mal 10.000 hat es auf meinem Laptop etwa 10 Sekunden gedauert (einschließlich der Erstellung der Starttabelle):
NamesDefaultToHere(1);
// Size the problem . . .
nr = 10000; // Number of rows
nc = 10000; // Number of columns
nm = 0.1; // Proportion of missing values
// Make a table and inject some missing values
mat = J(nr*nc, 1, RandomNormal());
mat[RandomIndex(nr*nc, nr*nc*nm)] = .;
dt = AsTable(Shape(mat, nr, nc));
dt << setName("Data with some missingness");
// Start here: Get values into a matrix (assumes contiguous numeric columns)
mat = dt << getAsMatrix;
// Reshape as a vector
mat = Shape(mat, nr*nc, 1);
// Replace missing
mat[Loc(mat, .)] = 0;
// Reshape back to a matrix
mat = Shape(mat, nc, nc);
// Make a new table
dt2 = AsTable(Shape(mat, nr, nc));
dt2 << setName("Data with missing set to zero values");
Betreff: Fehlende Werte durch 0 ersetzenHallo alle,
Ich habe an genau diesem Problem mit Hunderten von Spalten und Hunderten fehlenden Zeilen gearbeitet. Ich war mit der Leistung nicht zufrieden und habe viele Ansätze ausprobiert. Es scheint, dass Recode dieses Problem etwa 150-mal schneller löst als die aktuelle Lösung. Teilen Sie den Code mit allen anderen, denen die Geschwindigkeit am Herzen liegt. Bitte lassen Sie mich wissen, wenn Sie schneller etwas finden. Jede Millisekunde zählt! 

</CODE></P>
<PRE><CODE class=" language-jsl">replaceMissingStart = HP Time();
// replace missings with zeros
nc = dmdt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
col = Column(dt,nc[i]);
colname = col << getname();
Eval(Parse(EvalInsert("\[
dmdt << Recode Column(
:Name("^colname^"),
{Map Value( _rcOrig, {., 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :Name("^colname^") )
);
]\")));
//Code from the Community
//Column( nc[i] )[dmdt << get rows where( Is Missing( As Column( nc[i] ) ) )] = 0;
// standardize column attributes, change all to nominal
col << Set Modeling Type( "Nominal" )
);
replaceMissingStop = HP Time();
totalReplaceTime = replaceMissingStop-replaceMissingStart;
show(totalReplaceTime/1000000);
</CODE></P>
<P>Danke an Rebecca Lyzinski für die Idee!!!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-228122" slang="en-US" mode="NONE">Betreff: Fehlende Werte durch 0 ersetzen</LINGO-SUB><LINGO-BODY id="lingo-body-228122" slang="en-US" mode="NONE"><P>Ich verwende dieses Skript ständig.Ich kann Ihnen gar nicht genug für die Bereitstellung danken.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65695" slang="en-US" mode="NONE">Betreff: Fehlende Werte durch 0 ersetzen</LINGO-SUB><LINGO-BODY id="lingo-body-65695" slang="en-US" mode="NONE"><P>Versuchen Sie, Ihr Skript etwas konkreter zu gestalten.</P>
<P>Geben Sie der Datentabelle, die die spezifische Spalte enthält, ein Handle. Wie dt=table(); oder etwas ähnliches.</P>
<P>Verweisen Sie dann auf die Spalte in der Tabelle, dt::nameOFCol</P>
<P> </P>
<P>Es ist wahrscheinlich, dass Ihr Skript versucht, eine Spalte zu ändern, die in der zum Zeitpunkt der Ausführung dieses Schritts aktuellen Tabelle nicht vorhanden ist.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65039" slang="en-US" mode="NONE">Betreff: Fehlende Werte durch 0 ersetzen</LINGO-SUB><LINGO-BODY id="lingo-body-65039" slang="en-US" mode="NONE"><P>So etwas ist anhand einer Beschreibung schwer zu diagnostizieren.Sie müssten wahrscheinlich Ihr Skript veröffentlichen (oder zumindest genug davon, um das Problem zu reproduzieren), damit wir Ihnen helfen können.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64972" slang="en-US" mode="NONE">Betreff: Fehlende Werte durch 0 ersetzen</LINGO-SUB><LINGO-BODY id="lingo-body-64972" slang="en-US" mode="NONE"><P>Hallo Cameron,</P><P> </P><P>Ich habe JMP neu gestartet und das Skript funktioniert für die spezifische Datentabelle einwandfrei.Die fehlenden Werte werden durch Nullen ersetzt.Aber wenn ich es in den Rest meines Skripts integriere, erhalte ich die folgende Fehlermeldung:</P><P><EM><FONT color="#FF0000">Spalte konnte beim Zugriff oder bei der Auswertung von „Spalte“ nicht gefunden werden, Column/*###*/(nc[i])</FONT></EM></P><P> </P><P>Vor diesem Skript habe ich eine Originaldatentabelle, die ich anhand ausgewählter Spalten unterteile, die Daten stapele, zusammenfasse und dann in der endgültigen Datentabelle tabellarisch aufbereite.Ich versuche, fehlende Werte in der endgültigen Datentabelle durch Nullen zu ersetzen. </P><P> </P><P>Ich bin relativ neu im Umgang mit JMP-Skripten und weiß nicht, warum die Integration Probleme bereitet.Irgendeine Idee, warum das passiert?</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-64943" slang="en-US" mode="NONE">Betreff: Fehlende Werte durch 0 ersetzen</LINGO-SUB><LINGO-BODY id="lingo-body-64943" slang="en-US" mode="NONE"><P>Hallo<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/12425" target="_blank"> @nshivan</A> ,</P><P>Ich habe Jims Code in den Versionen 13 und 14 ausgeführt und keine Fehler erhalten.Vielleicht JMP neu starten und erneut ausführen?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64931" slang="en-US" mode="NONE">Betreff: Fehlende Werte durch 0 ersetzen</LINGO-SUB><LINGO-BODY id="lingo-body-64931" slang="en-US" mode="NONE"><P>Hallo Jim,</P>
<P> </P>
<P>Ich habe das oben genannte versucht, erhalte jedoch die folgende Fehlermeldung.</P>
<P> </P>
<P> </P>
<PRE><CODE class=" language-jsl">could not find column in access or evaluation of 'Column' , Column/*###*/(nc[i])
Irgendeine Idee, was los ist?Ich verwende JMP 13 und bin mir nicht sicher, ob die Syntax für diese Version nicht funktioniert.
Danke,
N
Betreff: Fehlende Werte durch 0 ersetzenHier ist die richtige Syntax für das, was Sie tun möchten
dt = Current Data Table();
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
Column( nc[i] )[dt << get rows where( Is Missing( As Column( nc[i] ) ) )] = 0
);