Sas 将信息合并到部门向量中
我想通过创建一个向量来总结一个数据集,该向量提供关于id所在部门的信息。比如说,Sas 将信息合并到部门向量中,sas,Sas,我想通过创建一个向量来总结一个数据集,该向量提供关于id所在部门的信息。比如说, data test; input id dept $; datalines; 1 A 1 D 1 B 1 C 2 C 3 D 4 A 5 C 5 D ; run; 我想要 id dept_vect 1 1111 2 0010 3 0001 4 1000 5 1001 部门要素的位置按字母顺序排列。因此,第一
data test;
input id dept $;
datalines;
1 A
1 D
1 B
1 C
2 C
3 D
4 A
5 C
5 D
;
run;
我想要
id dept_vect
1 1111
2 0010
3 0001
4 1000
5 1001
部门要素的位置按字母顺序排列。因此,第一个位置的“1”表示在部门a中找到id,第二个位置的“1”表示在部门B中找到id。a“0”表示在部门中找不到id
我可以用蛮力的方法解决这个问题
proc transpose data = test out = test1(drop = _NAME_);
by id;
var dept;
run;
data test2;
set test1;
array x[4] $ col1-col4;
array d[4] $ d1-d4;
do i = 1 to 4;
if not missing(x[i]) then do;
if x[i] = 'A' then d[1] = 1;
else if x[i] = 'B' then d[2] = 1;
else if x[i] = 'C' then d[3] = 1;
else if x[i] = 'D' then d[4] = 1;
end;
else leave;
end;
do i = 1 to 4;
if missing(d[i]) then d[i] = 0;
end;
dept_id = compress(d1) || compress(d2) || compress(d3) || compress(d4);
keep id dept_id;
run;
这是可行的,但有几个问题。要显示col4,我需要在所有部门上至少找到一个id,但这可以通过创建一个虚拟id来修复,以便在所有部门上找到id。但主要的问题是,这段代码不够健壮。有没有一种方法可以对其进行编码,从而使其适用于任何数量的部门
data have;
input id dept $;
count = 1;
datalines;
1 A
1 D
1 B
1 C
2 C
3 D
4 A
5 C
5 D
;
run;
proc transpose data=test out=wide prefix=dept;
by id;
id dept;
var count;
run;
data want;
set wide;
array _d(*) dept:;
do i=1 to dim(_d);
if missing(_d(i)) then _d(i) = 0;
end;
want = catt(of _d(*));
run;
data have;
input id dept $;
count = 1;
datalines;
1 A
1 D
1 B
1 C
2 C
3 D
4 A
5 C
5 D
;
run;
proc transpose data=test out=wide prefix=dept;
by id;
id dept;
var count;
run;
data want;
set wide;
array _d(*) dept:;
do i=1 to dim(_d);
if missing(_d(i)) then _d(i) = 0;
end;
want = catt(of _d(*));
run;
也许TRANSREG可以帮上忙
data test;
input id dept $;
datalines;
1 A
1 D
1 B
1 C
2 C
3 D
4 A
5 C
5 D
;
run;
proc transreg;
id id;
model class(dept / zero=none);
output design out=dummy(drop=dept);
run;
proc print;
run;
proc summary nway;
class id;
output out=want(drop=_type_) max(dept:)=;
run;
proc print;
run;
也许TRANSREG可以帮上忙
data test;
input id dept $;
datalines;
1 A
1 D
1 B
1 C
2 C
3 D
4 A
5 C
5 D
;
run;
proc transreg;
id id;
model class(dept / zero=none);
output design out=dummy(drop=dept);
run;
proc print;
run;
proc summary nway;
class id;
output out=want(drop=_type_) max(dept:)=;
run;
proc print;
run;