SAS:如何使用组中的多个关键字过滤掉

时间:2019-05-04 11:58:07

标签: sas

我有一个数据,其中包含每个人每个季节执行的活动-

Name Season Activity
A   1   x
A   1   y
A   1   z
A   1   t
A   2   y
A   2   u
A   3   x
B   1   u
B   1   v
B   2   r
B   2   x
B   2   y
B   3   k
B   3   j

如果一个人在第1季中有x&y活动,那么我希望他的第一个赛季的所有行都带有标志yes-

Name    Season  Disease Flag
A   1   x   Yes
A   1   y   Yes
A   1   z   Yes
A   1   t   Yes
A   2   y   No
A   2   u   No
A   3   x   No

类似地,我针对不同的季节和活动有不同的疾病组合。 我有5个活动变量(活动1-活动5)和30个无能组合,我需要为其创建5个标志。 我无法为此编写高效的代码。

我想出的代码是-

CREATE TABLE activity_x AS                  
SELECT a.*
FROM table1 as a join (SELECT distinct person, season from table1 
where activity= 'x') as b
on a.person  = b.person and a.season= b.season
ORDER BY person, season;
QUIT;

这将为我提供一个包含有关人和季节的所有信息的数据集,其中季节中至少一项活动是x。

类似地,我将重复活动y并获得一个数据集。

然后找到两者的内部联接。 但是问题在于活动代码组合非常复杂

Any one of this list    and     Any one of this list
a                                    r
b+c                                  m
d+c                                  n
s+c                                  o

还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这是问题第一部分的双重DOW循环方法:

data have;
input Name $ Season Activity $;
cards;
A   1   x
A   1   y
A   1   z
A   1   t
A   2   y
A   2   u
A   3   x
B   1   u
B   1   v
B   2   r
B   2   x
B   2   y
B   3   k
B   3   j
;
run;

data want;
 do _n_ = 1 by 1 until (last.Season);
  set have;
  by Name Season;
  if Activity = 'x' then __x_flag = 1;
  if Activity = 'y' then __y_flag = 1;
 end;
 do _n_ = 1 to _n_;
  set have;
  xy_flag = __x_flag and __y_flag;
  output;
 end;
 drop __:;
run;

您可以很容易地将其概括为处理您喜欢的任何条件-只需在第一个循环中为每个Activity值创建一个标志,然后在第二个循环中将它们组合。

与SQL方法相比,此方法的性能要好得多,因为它只对数据进行一次传递,而不是对每个值进行一次查询。