Come posso modificare una tabella di dati per trasformare i valori impostati come 0 in punto, ho trovato lo script per cambiare il punto in zero ma non l'alternativa.
Grazie,
Buon tempismo. Stavo solo lavorando su un codice correlato la scorsa settimana, riducendo i tempi di esecuzione e volevo aggiungere a quanto già detto.Passare dal ciclo delle righe e sostituirle con il metodo della matrice (che Vince fa riferimento sopra) in uno script ha migliorato il tempo di esecuzione di circa 20x-25x.In un altro script, il passaggio da get rows where() al metodo matrix lo ha migliorato di quasi 2 volte. Mentre lo stavo facendo, ho scritto il codice qui sotto in modo da poterlo condividere o fare riferimento in seguito, e sembra ragionevole pubblicarlo qui. Si noti che l'utilizzo di Loc() con elenchi di colonne di caratteri utilizza una sintassi diversa e non è possibile creare la logica più complessa come è possibile con le variabili a matrice che si ottengono da colonne numeriche. Quindi ho utilizzato una tecnica condivisa da Craige Hales ( linkato qui ) che utilizza array associativi e la funzione di intersezione. Spero che tu lo trovi utile.
Nota che questo script aggiunge nuove colonne di caratteri e inserisce commenti perché l'ho scritto a scopo dimostrativo. Data la domanda originale qui, potresti semplicemente sostituire le righe di assegnazione come c3[rowsMale] = "Maschio"; insieme a colonna(dtData, "età") [righeMaschio] = .; o simili.
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>
Se stai cercando di fare l'intero tavolo, potresti semplicemente farlo
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 matrixEcco un modo per convertire tutto lo "0" in un valore mancante, per una colonna denominata "A";
Names Default To Here( 1 );
dt = Current Data Table();
theRows = dt << get rows where( :A == 0 );
Try( :A[theRows] = . );
Suggerirei di dare un'occhiata a questo post Dovresti scorrere una tabella di dati o utilizzare Ricodifica o utilizzare Ottieni righe dove modificare i valori in una tabella di dati (e l'originale inviare ) e la discussione lì. Se non ricordo male il punto era sostituire 999 con il valore mancante. L'idea di base è solitamente quella di eseguire il ciclo su righe o colonne e sostituire i valori.