將缺失值替換為 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>
謝謝!
回复:用 0 替換缺失值>> 我可以用“N/A”字符串替換數字列中的缺失值嗎?
使用值標籤來做到這一點。 右鍵單擊列標題,轉到列屬性,選擇值標籤。 然後在值中輸入句點,在標籤字段中輸入 N/A,如下所示。 然後點擊添加,然後就ok了。
要編寫腳本,請按照上述步驟的日誌記錄器進行操作...
數據表( "DT name" ):第 904 列 << 值標籤( {"." = "N/A"} ) << 使用值標籤( 1 );

回复:用 0 替換缺失值在我可以用“N/A”字符串替換數字列中的缺失值嗎?
回复:用 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);
Russ Wolfinger 提到他認為矩陣可以更快地解決問題,我想你們兩個也是這麼想的!
回复:用 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秒。
回复:用 0 替換缺失值FWIW,這種方法可能會更好。 對於 10,000 x 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");
回复:用 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">回复:用 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">回复:用 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">回复:用 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">回复:用 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>在編寫這段腳本之前,我有一個原始數據表,我根據所選列對其進行子集化、堆疊數據、匯總 anf,然後將其製成最終數據表。我正在嘗試用 0 替換最終數據表中的缺失值。 </P><P> </P><P>我對 JMP 腳本相當陌生,不確定為什麼集成會出現問題。知道為什麼會發生這種情況嗎?</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-64943" slang="en-US" mode="NONE">回复:用 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>我在版本 13 和 14 中運行 Jim 的代碼,沒有出現任何錯誤。也許重新啟動 JMP 並再次運行它?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64931" slang="en-US" mode="NONE">回复:用 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,我不確定該語法是否不適用於該版本。
謝謝,
氮
回复:用 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
);