删除SAS中的空行

删除SAS中的空行,sas,Sas,我有一个包含空单元格的数据集。看起来像 Year Volume ID 2000 999 LSE 2001 . LSE . 555 LSE 2008 . NYSE 2010 1099 NYSE 我需要删除包含空单元格的行。输出应该如下所示 Year Volume ID 2000 999 LSE 2000 1099

我有一个包含空单元格的数据集。看起来像

 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;
但它也不起作用

我只想删除单元格为空的行。
有人能帮我解决这个问题吗?提前感谢

如果nmiss(),您可以通过检查必须填充的变量来使用子集

data test;
   set data;
   if nmiss(year,volume)=0 ;
run;

编辑:如果
year
volume
是数字,则此功能有效,如果是字符串,则可以使用
cmiss()
函数。

不要使用带数字变量的引号,例如:

if volume = .  then delete;
适用于字符或数字的其他选项:

if missing(volume) then delete;

缺少选项
仅影响在使用数字->字符时打印或转换内容的方式。在这种情况下,你有数字,所以它什么也做不了

您的第一个代码示例基本上是正确的-至少,当我尝试它时,它是有效的
不太正确,但它会(如注释所示)转换为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;

如果缺少变量,则返回true(其中包括28个总值,但
是最常见的)

执行多个操作的更好方法是使用or
cmiss
函数(
nmiss
用于数字,
cmiss
用于字符或混合类型)

这将返回缺失值的数量,然后您可以测试要查找的任何值(在本例中为零值)。你甚至可以:

data want;
  set have;
  if nmiss(of _NUMERIC_) = 0;
run;
其中
\u NUMERIC\u
是所有数值变量。(
对于这样的变量列表是必需的,以告诉SAS需要一个列表。)


顺便说一句,你的第二个不起作用,因为它把ID变量和其他变量放在一起。您可以通过查看该
cats
(即,将其分配给变量)的值来了解这一点。你可以说

如果cats(of u all)=ID,则删除


但是,正如我们中的一些人已经表明的那样,这可能不如使用
nmiss

的简单解决方案,您也可以在set语句中使用
where
子句:

data new_dataset;
 set old_dataset (where = (volume is not missing or year is not missing));
run;

我一直喜欢使用
不缺少
语法,因为它似乎太像写普通英语了

谢谢@Bendy,但它不起作用。。。输出T.T中有0个OB检查年份/数量变量是否为数字…如果是字符,则使用
cmiss()mentioned@Bendy:我编辑了你的评论,请检查这是否适合你。正如Joe提到的,你上面的代码仍然可以自动转换为数字。一定还有别的事。您的数据步骤中还有其他内容吗?
data want;
  set have;
  if nmiss(of _NUMERIC_) = 0;
run;
data new_dataset;
 set old_dataset (where = (volume is not missing or year is not missing));
run;