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

 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;

但是它不起作用。

我只想删除具有空单元格的行。
有人可以帮助我解决这个问题吗?提前致谢 !!!

最佳答案

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;

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

一种更好的方法是使用 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的简单解决方案。

10-08 08:30