Remplacer les valeurs manquantes par 0Bonjour,
J'essaie de remplacer toutes les valeurs manquantes dans une table de données par 0.Le script ci-dessous ne fonctionne pas.J'utilise JMP 13. Existe-t-il un autre moyen de procéder ?
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>
Merci!
Re : Remplacer les valeurs manquantes par 0>> Puis-je remplacer les valeurs manquantes dans la colonne numérique par la chaîne "N/A" ?
Utilisez des étiquettes de valeur pour ce faire. Faites un clic droit sur l'en-tête de colonne, accédez aux propriétés de la colonne, sélectionnez Étiquettes de valeur. Ensuite, mettez un point dans la valeur et N/A dans le champ de l'étiquette, comme indiqué ci-dessous. Cliquez ensuite sur ajouter, puis sur ok.
Pour le scripter, suivez l'enregistreur de journal des étapes ci-dessus...
Table de données( "Nom DT" ):Colonne 904 << Étiquettes de valeur( {"." = "N/A"} ) << Utiliser les étiquettes de valeur( 1 );

Re : Remplacer les valeurs manquantes par 0dans Puis-je remplacer les valeurs manquantes dans la colonne numérique par la chaîne "N/A" ?
Re : Remplacer les valeurs manquantes par 0Cher Ian et Craige,
Merci beaucoup pour vos soumissions. J'ai effectué quelques tests préliminaires et la solution de Ian est plus de 4 fois plus rapide que Recode pour cela et la solution de Craige est presque 10 fois plus rapide. Si quelqu'un souhaite comparer les 3 solutions, essayez ce qui suit :
//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 avait mentionné qu'il pensait que les matrices résoudraient le problème plus rapidement, je suppose que c'était aussi ce que vous pensiez tous les deux !
Re : Remplacer les valeurs manquantes par 0Combinaison de solutions, avec abonnement aux tables de données...
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);
Environ 10 secondes.
Re : Remplacer les valeurs manquantes par 0FWIW, ce genre d'approche pourrait être mieux. Pour 10 000 par 10 000 ça a pris environ 10 secondes sur mon portable (y compris faire le tableau de départ) :
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");
Re : Remplacer les valeurs manquantes par 0Salut tout le monde,
J'ai travaillé sur ce problème exact avec des centaines de colonnes avec des centaines de lignes manquantes. Je n'étais pas satisfait de la performance et j'ai essayé de nombreuses approches. Il semble que Recode résout ce problème environ 150 fois plus rapidement que la solution actuelle. Partager le code avec toute autre personne qui pourrait se soucier de la vitesse. S'il vous plaît laissez-moi savoir si vous trouvez quelque chose plus rapidement. Chaque milliseconde compte ! 
</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>Merci à Rebecca Lyzinski pour l'idée!!!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-228122" slang="en-US" mode="NONE">Re : Remplacer les valeurs manquantes par 0</LINGO-SUB><LINGO-BODY id="lingo-body-228122" slang="en-US" mode="NONE"><P>J'utilise ce script constamment.Je ne peux pas vous remercier assez de l'avoir fourni.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65695" slang="en-US" mode="NONE">Re : Remplacer les valeurs manquantes par 0</LINGO-SUB><LINGO-BODY id="lingo-body-65695" slang="en-US" mode="NONE"><P>essayez d'être un peu plus précis dans votre script.</P>
<P>donnez une poignée à la table de données contenant la colonne spécifique. Comme dt=table(); ou quelque chose comme ça.</P>
<P>puis reportez-vous à la colonne du tableau, dt::nameOFCol</P>
<P> </P>
<P>Il est probable que votre script essaie de modifier une colonne qui n'existe pas dans la table en cours lorsque cette étape s'exécute.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65039" slang="en-US" mode="NONE">Re : Remplacer les valeurs manquantes par 0</LINGO-SUB><LINGO-BODY id="lingo-body-65039" slang="en-US" mode="NONE"><P>Quelque chose comme ça est difficile à diagnostiquer à partir d'une description.Vous devrez probablement publier votre script (ou au moins suffisamment pour reproduire le problème) pour que nous puissions vous aider.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64972" slang="en-US" mode="NONE">Re : Remplacer les valeurs manquantes par 0</LINGO-SUB><LINGO-BODY id="lingo-body-64972" slang="en-US" mode="NONE"><P>Salut Cameron,</P><P> </P><P>J'ai redémarré JMP et le script fonctionne correctement sur la table de données spécifique.Les valeurs manquantes sont remplacées par des 0.Mais quand j'intègre le reste de mon script, cela me donne l'erreur ci-dessous :</P><P><EM><FONT color="#FF0000">impossible de trouver la colonne dans l'accès ou l'évaluation de 'Column' , Column/*###*/(nc[i])</FONT></EM></P><P> </P><P>Avant ce morceau de script, j'ai un tableau de données original que je sous-ensemble en fonction des colonnes sélectionnées, empiler les données, résumer et ensuite tabuler dans le tableau de données final.J'essaie de remplacer les valeurs manquantes dans le tableau de données final par des 0. </P><P> </P><P>Je suis assez nouveau dans les scripts JMP, je ne sais pas pourquoi l'intégration pose des problèmes.Une idée pourquoi cela se produit?</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-64943" slang="en-US" mode="NONE">Re : Remplacer les valeurs manquantes par 0</LINGO-SUB><LINGO-BODY id="lingo-body-64943" slang="en-US" mode="NONE"><P>Salut<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/12425" target="_blank"> @nshivan</A> ,</P><P>J'ai exécuté le code de Jim dans les versions 13 et 14 et je n'ai eu aucune erreur.Peut-être redémarrer JMP et l'exécuter à nouveau ?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64931" slang="en-US" mode="NONE">Re : Remplacer les valeurs manquantes par 0</LINGO-SUB><LINGO-BODY id="lingo-body-64931" slang="en-US" mode="NONE"><P>Salut Jim,</P>
<P> </P>
<P>J'ai essayé ce qui précède, mais j'obtiens l'erreur suivante.</P>
<P> </P>
<P> </P>
<PRE><CODE class=" language-jsl">could not find column in access or evaluation of 'Column' , Column/*###*/(nc[i])
Une idée de ce qui se passe ?J'utilise JMP 13, je ne sais pas si la syntaxe ne fonctionne pas pour cette version.
Merci,
N
Re : Remplacer les valeurs manquantes par 0Voici la syntaxe correcte pour ce que vous essayez de faire
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
);