删除SAS数据集中除一列以外缺少所有其他值的行

删除SAS数据集中除一列以外缺少所有其他值的行,sas,missing-data,Sas,Missing Data,我有一个SAS数据集,比如说,df,如下所示: Input: A B C D 1 . . . 2 . . . 3 0 1 1 4 1 0 1 数据创建代码: data df; input A B C D; DATALINES; 1 . . . 2 . . . 3 0 1 1 4 1 0 1 ; run; 现在我想删除前两行。我需要的逻辑是删除df中的那些行,其中除了a中的所有值都在一行中丢失 Output: A B C D 3 0 1 1 4 1 0 1 我对SAS非常陌生,我要求

我有一个SAS数据集,比如说,
df
,如下所示:

Input:
A B C D
1 . . .
2 . . .
3 0 1 1
4 1 0 1
数据创建代码:

data df;
  input A B C D;
  DATALINES;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;
run;
现在我想删除前两行。我需要的逻辑是删除
df
中的那些行,其中除了
a
中的所有值都在一行中丢失

Output:
A B C D
3 0 1 1
4 1 0 1
我对SAS非常陌生,我要求回答,但没有
proc sql

注意:这里我只给出了4列。实际上我有超过25列。我需要一个不使用列名B、C、D的通用答案

编辑:

然后您可以在where子句中为条件使用值'var_names',如下所示:

where&var\u名称

编辑:

然后您可以在where子句中为条件使用值'var_names',如下所示:

where&var\u名称


将所有相关变量放入一个数组中,并计算未缺失值的数量。输出具有一个或多个非缺失值的所有行

data want;
    set df;
    array varlist B -- D;
    do over varlist;
        not_missing = sum(not_missing, ^missing(varlist));
    end;
    if not_missing > 0 and ^missing(A) then output;
run;
data have;
Input A B C D;
datalines;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;
run;

data have;
modify have;
if n(of B--D)=0 then remove;
run;

将所有相关变量放入一个数组中,并计算未缺失值的数量。输出具有一个或多个非缺失值的所有行

data want;
    set df;
    array varlist B -- D;
    do over varlist;
        not_missing = sum(not_missing, ^missing(varlist));
    end;
    if not_missing > 0 and ^missing(A) then output;
run;
data have;
Input A B C D;
datalines;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;
run;

data have;
modify have;
if n(of B--D)=0 then remove;
run;

如果所有变量都是数值,则
n
函数将工作,因为这将统计非缺失值的数量

data want;
    set df;
    array varlist B -- D;
    do over varlist;
        not_missing = sum(not_missing, ^missing(varlist));
    end;
    if not_missing > 0 and ^missing(A) then output;
run;
data have;
Input A B C D;
datalines;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;
run;

data have;
modify have;
if n(of B--D)=0 then remove;
run;

如果所有变量都是数值,则
n
函数将工作,因为这将统计非缺失值的数量

data want;
    set df;
    array varlist B -- D;
    do over varlist;
        not_missing = sum(not_missing, ^missing(varlist));
    end;
    if not_missing > 0 and ^missing(A) then output;
run;
data have;
Input A B C D;
datalines;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;
run;

data have;
modify have;
if n(of B--D)=0 then remove;
run;

您可以对数字和字符变量使用
CMISS()
函数。但是你需要知道有多少变量

data have;
  input A B C $ D;
cards;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;

data want;
  set have;
  if cmiss(of B--D)<3 ;
run;
数据已经存在;
输入A B C$D;
卡;
1.
2.
3 0 1 1
4 1 0 1
;
数据需求;
集有;

如果cmiss(B--D)可以对数值和字符变量使用
cmiss()
函数。但是你需要知道有多少变量

data have;
  input A B C $ D;
cards;
1 . . .
2 . . .
3 0 1 1
4 1 0 1
;

data want;
  set have;
  if cmiss(of B--D)<3 ;
run;
数据已经存在;
输入A B C$D;
卡;
1.
2.
3 0 1 1
4 1 0 1
;
数据需求;
集有;

如果我(B--D)对不起,安德烈,我刚才忘了提到那张便条了。更新说明。无论如何,谢谢你的回复。对不起,安德烈,我之前忘了提到那张便条了。更新说明。无论如何,感谢您的回复。每行中可能有不同的列缺少值?不,我的要求是,我在a中始终有一个值。只有B到D将始终缺少值。每行中可能有不同的列缺少值?不,我的要求是,我总是在a中有一个值。只有B到D总是缺少值。对于数字列来说,逻辑是好的,但是我有字符列来使用CMISS()函数,但是您需要知道有多少变量<代码>如果cmiss(b--d)@Tom正是我要说的。除非它应该说=3,这不取决于您在其中使用表达式的语句。子集if:
if CMISS(B--D)该逻辑适用于数字列,但我使用字符列来代替CMISS()函数,但您需要知道有多少变量<代码>如果cmiss(b--d)@Tom正是我要说的。除非它应该说=3,这不取决于您在其中使用表达式的语句。子集if:
如果CMISS(B--D)逻辑失败,如果我在B或C或D的前2行中有一个非缺失值,并且缺少a。我的意思是,如果a在第一行为null,B在第一行中不为null,它仍然作为输出。你能在你的问题中给出一个数据示例吗?您是否要检查A中是否有遗漏?我将把我的答案改为单独检查A。如果我在前两行的B或C或D中有一个非缺失值,并且缺少A,那么逻辑就失败了。我的意思是,如果A为空,B在第一行中不为空,它仍然作为输出。你能在你的问题中给出一个数据示例吗?您是否要检查A中是否有遗漏?我将把答案改为单独检查A。