我有一个数据,其中包含每个人每个季节执行的活动-
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
还有更好的方法吗?
答案 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方法相比,此方法的性能要好得多,因为它只对数据进行一次传递,而不是对每个值进行一次查询。