Comment puis-je modifier une table de données pour transformer des valeurs définies comme 0 en point, j'ai trouvé le script pour changer le point en zéro mais pas l'alternative.
Merci,
Bon timing. Je travaillais juste sur un code connexe la semaine dernière, en réduisant le temps d'exécution, et je voulais ajouter à ce qui avait déjà été dit.Passer de la boucle à travers les lignes et le remplacer par la méthode matricielle (auxquelles Vince fait référence ci-dessus) dans un script a amélioré le temps d'exécution d'environ 20x-25x.Sur un autre script, le passage de get rows where() à la méthode matrix l'a amélioré de près de 2x. Pendant que je le faisais, j'ai écrit le code ci-dessous afin de pouvoir le partager ou le référencer plus tard, et il semble raisonnable de le publier ici. Notez que l'utilisation de Loc() avec des listes de colonnes de caractères utilise une syntaxe différente et vous ne pouvez pas construire la logique plus complexe comme vous le pouvez avec des variables entièrement matricielles que vous obtenez à partir de colonnes numériques. J'ai donc utilisé une technique partagée par Craige Hales ( lié ici ) qui utilise des tableaux associatifs et la fonction d'intersection. J'espère que vous le trouverez utile.
Notez que ce script ajoute de nouvelles colonnes de caractères et y met des commentaires car je l'ai écrit à des fins de démonstration. Compte tenu de la question d'origine ici, vous pouvez simplement remplacer les lignes d'affectation telles que c3[rowsHomme] = "Homme" ; avec colonne(dtData, "age") [lignesHomme] = .; ou similaire.
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>
Si vous essayez de faire toute la table, vous pourriez simplement le faire
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 matrixVoici une façon de convertir tous les "0" en une valeur manquante, pour une colonne nommée "A" ;
Names Default To Here( 1 );
dt = Current Data Table();
theRows = dt << get rows where( :A == 0 );
Try( :A[theRows] = . );
Je te conseille de jeter un oeil à ce post Devez-vous parcourir une table de données ou utiliser Recode, ou utiliser Get Rows Where pour modifier les valeurs dans une table de données (et l'original poste ) et la discussion là-bas. Si je me souviens bien, il s'agissait de remplacer 999 par une valeur manquante. L'idée de base est généralement de boucler sur des lignes ou des colonnes et de remplacer des valeurs.