Sas 根据条件删除行
我想根据某些条件删除SAS中的行(或观察):如果名称列中的第I个名称与第(I+1)个名称相同,并且第I个日期与第(I+1)个日期相同,请删除第(I+1)行。我还想删除行I+2、I+3等。如果这些列中的条目与行I中的条目相同。但是,如果前面的行被删除,这可能会迭代完成 我是SAS的新手。我知道我应该使用某种形式的循环,但我不知道如何使用它。这个问题已经困扰了我好几天了。我希望有人能帮助我。测试数据:Sas 根据条件删除行,sas,Sas,我想根据某些条件删除SAS中的行(或观察):如果名称列中的第I个名称与第(I+1)个名称相同,并且第I个日期与第(I+1)个日期相同,请删除第(I+1)行。我还想删除行I+2、I+3等。如果这些列中的条目与行I中的条目相同。但是,如果前面的行被删除,这可能会迭代完成 我是SAS的新手。我知道我应该使用某种形式的循环,但我不知道如何使用它。这个问题已经困扰了我好几天了。我希望有人能帮助我。测试数据: +-----------+--------+-------+ | date | name
+-----------+--------+-------+
| date | name | value |
+-----------+--------+-------+
| 10MAY2019 | param1 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param1 | 2 |
+-----------+--------+-------+
| 10MAY2019 | param1 | 2 |
+-----------+--------+-------+
| 10MAY2019 | param2 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param3 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param4 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param5 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param5 | 1 |
+-----------+--------+-------+
我的解决方案是通过连接参数生成密钥并保留它
data test;
format date date9.;
input name $6. value date yymmdd10.;
datalines4;
param1 1 2019-05-10
param1 2 2019-05-10
param1 2 2019-05-10
param2 1 2019-05-10
param3 1 2019-05-10
param4 1 2019-05-10
param5 1 2019-05-10
param5 1 2019-05-10
;;;;
run;
data want(drop=key);
set test;
retain key;
if _N_ = 1 then do;
key = strip(name) || strip(put(date,date9.));
output;
end;
else if key ne strip(name) || strip(put(date,date9.)) then do;
key = strip(name) || strip(put(date,date9.));
output;
end;
run;
结果:
+-----------+--------+-------+
| date | name | value |
+-----------+--------+-------+
| 10MAY2019 | param1 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param2 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param3 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param4 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param5 | 1 |
+-----------+--------+-------+
测试数据:
+-----------+--------+-------+
| date | name | value |
+-----------+--------+-------+
| 10MAY2019 | param1 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param1 | 2 |
+-----------+--------+-------+
| 10MAY2019 | param1 | 2 |
+-----------+--------+-------+
| 10MAY2019 | param2 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param3 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param4 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param5 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param5 | 1 |
+-----------+--------+-------+
我的解决方案是通过连接参数生成密钥并保留它
data test;
format date date9.;
input name $6. value date yymmdd10.;
datalines4;
param1 1 2019-05-10
param1 2 2019-05-10
param1 2 2019-05-10
param2 1 2019-05-10
param3 1 2019-05-10
param4 1 2019-05-10
param5 1 2019-05-10
param5 1 2019-05-10
;;;;
run;
data want(drop=key);
set test;
retain key;
if _N_ = 1 then do;
key = strip(name) || strip(put(date,date9.));
output;
end;
else if key ne strip(name) || strip(put(date,date9.)) then do;
key = strip(name) || strip(put(date,date9.));
output;
end;
run;
结果:
+-----------+--------+-------+
| date | name | value |
+-----------+--------+-------+
| 10MAY2019 | param1 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param2 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param3 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param4 | 1 |
+-----------+--------+-------+
| 10MAY2019 | param5 | 1 |
+-----------+--------+-------+
这是一个处理任务,可以使用
BY
语句和自动先行。
BY group variable标志来解决
data want;
set have;
by date name;
if first.name;
run;
如果按组行连续但未排序,则可以将NOTSORTED
选项添加到by
语句中
如果实际数据结构具有附加的“父级”分类变量,则需要在by group语句中使用附加变量,该类变量进一步扩展了组名称:日期(例如
insuranceCompany
和policyGroup
,或团队
).这是一项处理任务,可以先使用BY
语句和自动BY group variable标志来解决
data want;
set have;
by date name;
if first.name;
run;
如果按组行连续但未排序,则可以将NOTSORTED
选项添加到by
语句中
如果实际数据结构具有附加的“父级”分类变量,且该类变量进一步扩展了组名:日期(例如,保险公司
和保单组
,或团队
),则需要在by group语句中使用附加变量。如果i+2等于i+1和i,你需要对这个观察做些什么?(当然还有i+3等等)好问题,也许应该加上这个。我现在会的。如果有I+2等于I+1和I,你需要对这个观察做什么?(当然还有I+3等等)好问题,也许应该加上这个。我现在就来。