欠損値を 0 に置き換えますこんにちは、
データテーブル内のすべての欠損値を 0 に置き換えようとしています。以下のスクリプトは機能しません。JMP 13 を使用しています。他に方法はありますか?
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>
ありがとう!
Re: 欠損値を 0 に置き換えます>> 数値列の欠損値を「N/A」文字列に置き換えることはできますか?
これを行うには、値ラベルを使用します。 列ヘッダーを右クリックし、列のプロパティに移動し、値ラベルを選択します。 次に、以下に示すように、値にピリオドを入力し、ラベル フィールドに N/A を入力します。 次に、「追加」をクリックし、「OK」をクリックします。
スクリプトを作成するには、上記の手順のログ レコーダーに従います。
データ テーブル( "DT 名" ):列 904 << 値ラベル( {"." = "N/A"} ) << 値ラベル( 1 ) を使用します。

Re: 欠損値を 0 に置き換えますin 数値列の欠損値を「N/A」文字列に置き換えることはできますか?
Re: 欠損値を 0 に置き換えます親愛なるイアンとクレイジへ
たくさんのご応募ありがとうございました。 いくつかの予備テストを実行したところ、Ian のソリューションは Recode よりも 4 倍以上高速で、Craige のソリューションはほぼ 10 倍高速でした。 3 つのソリューションすべてを比較したい場合は、次のことを試してください。
//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);
ラス・ウルフィンガーは、行列を使えばより早く問題を解決できると考えていると述べていましたが、あなたたち二人も同じように考えていたのでしょう。
Re: 欠損値を 0 に置き換えますデータテーブルの添字を使用してソリューションを組み合わせる...
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);
10秒ほど。
Re: 欠損値を 0 に置き換えますFWIW、この種のアプローチの方が良いかもしれません。 10,000 × 10,000 の場合、私のラップトップでは約 10 秒かかりました (開始テーブルの作成を含む)。
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: 欠損値を 0 に置き換えますこんにちは、みんな、
私は、数百の行が欠落している数百の列を扱う、まさにこの問題に取り組んできました。 私はパフォーマンスに満足できず、さまざまなアプローチを試しました。 Recode は、現在のソリューションよりも約 150 倍速くこの問題を解決しているようです。 速度を気にする可能性のある他の人とコードを共有します。 もっと早いものを見つけたら教えてください。 ミリ秒単位が重要です。 
</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>アイデアをくれた Rebecca Lyzinski に感謝します!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-228122" slang="en-US" mode="NONE">Re: 欠損値を 0 に置き換えます</LINGO-SUB><LINGO-BODY id="lingo-body-228122" slang="en-US" mode="NONE"><P>私はこのスクリプトを常に使用しています。提供していただき感謝してもしきれません。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65695" slang="en-US" mode="NONE">Re: 欠損値を 0 に置き換えます</LINGO-SUB><LINGO-BODY id="lingo-body-65695" slang="en-US" mode="NONE"><P>スクリプトをもう少し具体的にしてみてください。</P>
<P>特定の列を含むデータ テーブルにハンドルを与えます。 dt=table(); のように。とかそのようなもの。</P>
<P>次に、テーブル内の列 dt::nameOFCol を参照します。</P>
<P> </P>
<P>このステップの実行時に現在のテーブルに存在しない列をスクリプトが変更しようとしている可能性があります。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65039" slang="en-US" mode="NONE">Re: 欠損値を 0 に置き換えます</LINGO-SUB><LINGO-BODY id="lingo-body-65039" slang="en-US" mode="NONE"><P>このようなものを説明から判断するのは困難です。おそらく、私たちが問題を解決できるよう、スクリプト (または少なくとも問題を再現するのに十分なスクリプト) を投稿する必要があります。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64972" slang="en-US" mode="NONE">Re: 欠損値を 0 に置き換えます</LINGO-SUB><LINGO-BODY id="lingo-body-64972" slang="en-US" mode="NONE"><P>こんにちは、キャメロン</P><P> </P><P>JMP を再起動したところ、スクリプトは特定のデータ テーブルで正常に動作しました。欠損値は 0 に置き換えられます。しかし、スクリプトの残りの部分に統合すると、次のエラーが表示されます。</P><P><EM><FONT color="#FF0000">'Column' のアクセスまたは評価で列が見つかりませんでした、 Column/*###*/(nc[i])</FONT></EM></P><P> </P><P>このスクリプト部分の前に、選択した列に基づいてサブセット化した元のデータ テーブルがあり、データをスタックし、集計して最終的なデータ テーブルに表を作成します。最終的なデータテーブルの欠損値を0に置き換えようとしています。 </P><P> </P><P>私は JMP スクリプトをあまり使用したことがないので、統合によって問題が発生する理由がわかりません。なぜこれが起こっているのかわかりますか?</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-64943" slang="en-US" mode="NONE">Re: 欠損値を 0 に置き換えます</LINGO-SUB><LINGO-BODY id="lingo-body-64943" slang="en-US" mode="NONE"><P>やあ<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/12425" target="_blank">@nshivan</A> 、</P><P>Jim のコードをバージョン 13 と 14 で実行しましたが、エラーは発生しませんでした。JMP を再起動してもう一度実行してみてはいかがでしょうか。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64931" slang="en-US" mode="NONE">Re: 欠損値を 0 に置き換えます</LINGO-SUB><LINGO-BODY id="lingo-body-64931" slang="en-US" mode="NONE"><P>こんにちは、ジムさん</P>
<P> </P>
<P>上記を試してみましたが、以下のエラーが発生しました。</P>
<P> </P>
<P> </P>
<PRE><CODE class=" language-jsl">could not find column in access or evaluation of 'Column' , Column/*###*/(nc[i])
何が起こっているのかわかりますか?JMP 13 を使用していますが、構文がこのバージョンで機能しないのかどうかはわかりません。
ありがとう、
N
Re: 欠損値を 0 に置き換えますあなたがやろうとしていることの正しい構文は次のとおりです
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
);