将缺失值替换为 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
);