Wie kann ich eine Datentabelle ändern, um Werte, die als 0 gesetzt sind, in Punkt umzuwandeln? Ich habe das Skript zum Ändern von Punkt auf Null gefunden, aber nicht die Alternative.
Vielen Dank,
Gutes Timing. Ich habe gerade letzte Woche an einem verwandten Code gearbeitet, die Ausführungszeit verkürzt und wollte das bereits Gesagte ergänzen.Der Übergang vom Durchlaufen der Zeilen und Ersetzen durch die Matrixmethode (auf die Vince oben verweist) in einem Skript verbesserte die Ausführungszeit um etwa das 20- bis 25-fache.Bei einem anderen Skript verbesserte es der Wechsel von get rows where() zur matrix-Methode um fast das Zweifache. Während ich dies tat, schrieb ich den folgenden Code, damit ich ihn später teilen oder darauf verweisen konnte, und es scheint vernünftig, ihn hier zu veröffentlichen. Beachten Sie, dass die Verwendung von Loc() mit Listen aus Zeichenspalten eine andere Syntax verwendet und Sie keine komplexere Logik erstellen können, wie Sie es mit All-Matrix-Variablen können, die Sie aus numerischen Spalten erhalten. Also habe ich eine von Craige Hales geteilte Technik verwendet ( hier verlinkt ), die assoziative Arrays und die Schnittfunktion verwendet. Ich hoffe, Sie finden es nützlich.
Beachten Sie, dass dieses Skript neue Zeichenspalten hinzufügt und dort Kommentare einfügt, da ich es zu Demozwecken geschrieben habe. Angesichts der ursprünglichen Frage hier könnten Sie einfach die Zuordnungszeilen wie ersetzen c3[rowsMale] = "Männlich"; mit Spalte (dtData, "Alter") [ZeilenMännlich] = .; oder ähnliches.
names default to here(1);
dtData = Open( "$SAMPLE_DATA/Big Class.jmp" );
mAge = column(dtData, "age") << get values(); //a matrix
mHeight = column(dtData, "height") << get values(); //a matrix
lSex = column(dtData, "sex") << get values(); //a list
lName = column(dtData, "name") << get values(); //a list
<BR />//note the results of the Loc() function will return a matrix that corresponds to the rows that match the criteria<BR />
rowsTall = Loc(mHeight > 63); // simple comparison in Loc() function.
c1 = new column("Comments 1","Character");
c1[rowsTall] = "Tall";
rowsTallAndOver13 = Loc( (mHeight > 63) & (mAge > 13)); // can build more complex logic in Loc() function
c2 = new column("Comments 2","Character");
c2[rowsTallAndOver13] = "Tall and 14 or older";
rowsMale = Loc(lSex, "M"); // note syntax is slightly different with Loc() for lists when dealing with character columns.
//rowsMaleNamedRobert = Loc((lSex, "M"), (lName, "Robert")); // Cannot build complex comparisons with Character columns, see below on the intersection and AA's
c3 = new column("Comments 3","Character");
c3[rowsMale] = "Male";
//rowsTall17M = Loc((mHeight > 63) & (mAge == 17) & (lSex == "M") ); // attempt at building complex logic but the syntax is not correct, and can't have lists in a compound comparison
//rowsTall17M = Loc((mHeight > 63) & (mAge == 17) & (lSex, "M") ); // attempt at building complex logic. Syntax is closer to correct, but can't have lists in a compound comparison<BR />//Build numeric comparisons all at once, then do character comparisons one at a time. Only 1 character comparison shown here.
rowsTall17 = Loc((mHeight > 63) & (mAge == 17) ); // Build the numeric parts separate from char column(s)
rowsMale = Loc(lSex, "M"); // Character columns separately. Seems you need one variable per character column, and then intersect them all later.
<BR />//insert above into associative arrays, use intersection function to get the matrices intersection
aa_rowsTall17 = associative array(rowsTall17);
aa_rowsMale = associative array(rowsMale);
intersection = aa_rowsMale; // copy of aa_rowsMale, as intersection gets modified in next line
intersection<<INTERSECT> 63) );
c5 = new column("Comments 5 - using get rows where","Character");
c5[gRowsTallM17] = "Tall, Male, 17";</INTERSECT>
Wenn Sie versuchen, die ganze Tabelle zu machen, könnten Sie es tun
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
dt:weight[[1, 5, 6, 8]] = 0; // just setting them to 0
dt:height[[11, 15, 16, 18]] = 0;
wait(2);
// this is the bit you'll want
numeric_cols = dt << Get Column Names("Numeric", "string");
m = dt[0, numeric_cols]; // get the values as a matrix;
m[Loc(m==0)]=.; // set them to missing
dt[0, numeric_cols] = m; // set the data to the matrixHier ist eine Möglichkeit, alle "0" in einen fehlenden Wert für eine Spalte mit dem Namen "A" umzuwandeln;
Names Default To Here( 1 );
dt = Current Data Table();
theRows = dt << get rows where( :A == 0 );
Try( :A[theRows] = . );
Ich würde vorschlagen, einen Blick auf diesen Beitrag zu werfen Sollten Sie eine Datentabelle durchlaufen oder Recode verwenden oder Get Rows Where verwenden, um Werte in einer Datentabelle zu ändern (und das Original Post ) und die Diskussion dort. Wenn ich mich richtig erinnere, war der Punkt, 999 durch den fehlenden Wert zu ersetzen. Die Grundidee besteht normalerweise darin, Zeilen oder Spalten zu durchlaufen und Werte zu ersetzen.