我的数据集包含空单元格。它看起来像
Year Volume ID
2000 999 LSE
2001 . LSE
. 555 LSE
2008 . NYSE
2010 1099 NYSE
我需要删除包含空单元格的行。输出应该如下所示
Year Volume ID
2000 999 LSE
2000 1099 NYSE
我尝试了以下代码
data test;
set data;
if volume = " . " then delete;
if year= " . " then delete;
run;
但输出文件有0个观察值,SAS给了我
NOTE: Character values have been converted to numeric values at the
places given by (Line):(Column).
我也试过
options missing = ' ';
data test;
set data;
if missing(cats(of _all_)) then delete;
run;
但它的效果不佳。
我只想删除空单元格的行。 有人可以帮我解决这个问题吗?在此先感谢!!!
答案 0 :(得分:3)
Options Missing
仅影响数字化时打印或转换的方式 - >字符。在这种情况下,你有数字,所以它什么都没有。
你的第一个代码示例大多是正确的 - 至少,当我尝试它时,它是有效的。 " . "
不是很正确,但它会转换(如说明所示),因为这些字符都不是数字。
这样做的正确方法之一是:
data have;
input Year Volume ID $;
datalines;
2000 999 LSE
2001 . LSE
. 555 LSE
2008 . NYSE
2010 1099 NYSE
;;;;
run;
data want;
set have;
if year = . then delete;
if volume = . then delete;
run;
或
data want;
set have;
if missing(year) then delete;
if missing(volume) then delete;
run;
如果缺少变量, missing
将返回true(其中包含28个总值,但.
是最常见的)。
更好的方法是使用nmiss
或cmiss
函数(nmiss
代表数字,cmiss
代表字符或混合类型。)
data want;
set have;
if nmiss(year,volume) = 0;
run;
这将返回缺失值的数量,然后您可以测试您要查找的任何值(在这种情况下,零值)。你甚至可以这样做:
data want;
set have;
if nmiss(of _NUMERIC_) = 0;
run;
其中_NUMERIC_
是所有数字变量。 (这样的变量列表需要of
来告诉SAS期望列表。)
顺便说一下,你的第二个不起作用,因为它正在将ID变量与其他变量一起捕获。您可以通过查看cats
的值(即将其分配给变量)来看到这一点。你可以说
if cats(of _all_) = ID then delete;
但正如我们中的一些人所表明的那样,可能不如使用nmiss
的简单解决方案。
答案 1 :(得分:1)
您可以通过检查必须填充的变量来使用子集if nmiss()
:
data test;
set data;
if nmiss(year,volume)=0 ;
run;
答案 2 :(得分:1)
不要在数字变量中使用引号,例如:
if volume = . then delete;
适用于字符或数字的其他选项:
if missing(volume) then delete;
答案 3 :(得分:0)
您也可以在set语句中使用where
子句:
data new_dataset;
set old_dataset (where = (volume is not missing or year is not missing));
run;
我总是喜欢使用is not missing
语法,因为它似乎与编写普通英语非常相似