全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2653 7
2009-06-09
我有一个数据表如下:
comments   category
d1          cat1
d2          cat2
d3          cat1, cat2
d4          cat3
d5          cat1,cat2, cat3
d6          cat 2
d7          cat 1
....
d50       cat 50
.....
.....
我想转换成如下数据表:

comments  cat1  cat2  cat3 .... d50
d1                1      0       0     ....  0
d2                0      1       0     ....  0
d3                1      1       0     ....  0
d4                0      0       1     ....  0
d5                1      1       1     ....  0
d6                0      1       0    ....  0
d7                1      0       0   ....  0
..
d50              0     0        0  .....  1

把0, 1 换成 N, Y  也行。 Category 中的类型在实际中是不规则的。
也就是说:cat1 实际的名称可能是: test_of_input
cat2: 实际的名称可能是: battery issue
一共有50 个类型。
我有类型表可以用来转换。

请高手帮忙。
多谢了

[此贴子已经被作者于2009-6-9 4:55:03编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-6-9 06:05:00
data sa;
input comments $ category $40.;
cards;
d1          cat1
d2          cat2
d3          cat1,cat2
d4          cat3
d5          cat1,cat2,cat3
d6          cat2
d7          cat1
;
option mprint mlogic symbolgen;
%macro s(n);
data r;set sa;
%do i=1 %to &n;
y&i=scan(category,&i,',');
if y&i="cat&i" then cat&i=1;
%end;
array a cat1-cat&n;
do over a;
if a=. then a=0;
end;
run;
%mend;
%s(3);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-9 08:06:00
This is a very good question. i feel that the above author had given a good framework.Thanks.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-9 09:28:00
抛块砖头,(假设只有50个类别CAT1-CAT50)
data cat_index;
    retain fmtname 'cat_index' type 'i' hlo 'u';
    do label=1 to 50;
        start = cats('CAT', label);
        output;
    end;
proc format cntlin=cat_index;
data sa;
    input comments $ category $40.;
    array cat[50];
    call pokelong(repeat(put(0,rb8.), dim(cat)), addrlong(cat[1]), 8*dim(cat));
    do _n_=1 by 1 while (scan(category, _n_, ',') ne '');
        cat[input(left(scan(category, _n_, ',')), cat_index.)] = 1;
    end;
cards;
d1          cat1
d2          cat2
d3          cat1,cat2
d4          cat3
d5          cat1,cat2,cat3
d6          cat2
d7          cat1
d50          cat7, cat21, cat41, cat43, cat47
;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-9 11:06:00
data sa;
input comments $ category $40.;
cards;
d1 ctt,avv
d2 avv
d3 ctt,avv
d4 gdd
d5 ctt,avv,gdd
d6 avv
d7 ctt
;
data x;
input cate $ @@;
cards;
ctt avv gdd
;
option mprint mlogic symbolgen;
%macro s(n);
data _null_;
set x;
call symput(left(compress('cat'||_n_)),trim(cate));
data r;set sa;
%do i=1 %to &n;
y&i=left(trim(scan(category,&i,',')));
%do t=1 %to &n;
if y&i = "&&cat&t" then &&cat&t=1;
%end;
%end;
%do x=1 %to &n;
if &&cat&x=. then  &&cat&x=0;
%end;
drop y1-y&n;
run;
%mend;
%s(3);
我的这个code有个缺点,必须先把所有category的具体值先输入进去,存成变量。
还有n多的循环。。。唉,编程真是痛苦。。

[此贴子已经被作者于2009-6-9 11:12:51编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-9 12:30:00
*可怜的孩子!;
data sa;
    input comments $ category $40.;
    length cat $ 40;
    do _n_=1 by 1 while(scan(category, _n_, ',') ne '');
        cat = left(scan(category, _n_, ','));
        ind = 1;
        output;
    end;
cards;
d1 ctt,avv
d2 avv
d3 ctt,avv
d4 gdd
d5 ctt,avv,gdd
d6 avv
d7 ctt
;
options missing=0;
proc transpose data=sa out=sa1(drop=_name_);
    by comments;
    var ind;
    id cat;
run;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群