楼主: gaotao0727
2826 12

数据集中观测再重新生成变量与值 [推广有奖]

  • 1关注
  • 10粉丝

已卖:67份资源

副教授

79%

还不是VIP/贵宾

-

威望
0
论坛币
545 个
通用积分
11.1290
学术水平
18 点
热心指数
18 点
信用等级
12 点
经验
27715 点
帖子
873
精华
0
在线时间
855 小时
注册时间
2011-8-8
最后登录
2025-9-11

楼主
gaotao0727 发表于 2014-7-16 22:47:51 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我目前有这样一个数据集,
QQ截图20140716161612.png
根据Appl_ID将A_cate,B_cate两个大分类拆分成几个子分类,Attr1、Attr2是A_cate下的两个子分类,其Num值分别是24和20,如果是Attr1值,则Attr2的值为缺失。B_cate分类下Bttr1的Num值和Level值分别是10和0.88,Bttr2类似。
希望产生如下的数据集,
QQ截图20140716224557.png
高手们,帮帮忙,先谢了哈~~
二维码

扫码加我 拉你入群

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

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

关键词:生成变量 数据集 Level appl Leve

衣带渐宽终不悔,为伊消得人憔悴~~

沙发
freerunning_sky 在职认证  发表于 2014-7-17 09:16:37
  1. data a;
  2.         input A_cate :$30. B_cate :$30.;
  3.         cards;
  4.         cate_Attr1_Num_24 cate_Bttr1_Num_10_Level_0.88
  5.         cate_Attr2_Num_20 cate_Bttr2_Num_8_Level_0.66
  6.         ;
  7. run;

  8. data b;
  9.         set a;
  10.         if scan(A_cate,2,"_")="Attr1" then Attr1_num=scan(A_cate,-1,"_");else
  11.         if scan(A_cate,2,"_")="Attr2" then Attr2_num=scan(A_cate,-1,"_");

  12.         if scan(B_cate,2,"_")="Bttr1" then do;
  13.                 Bttr1_num=scan(B_cate,-3,"_");
  14.                 Bttr1_level=scan(B_cate,-1,"_");
  15.         end;else
  16.         if scan(B_cate,2,"_")="Bttr2" then do;
  17.                 Bttr2_num=scan(B_cate,-3,"_");
  18.                 Bttr2_level=scan(B_cate,-1,"_");
  19.         end;

  20. run;
复制代码

藤椅
ReneeD 发表于 2014-7-17 10:51:22
字符串处理,
不错的例子

板凳
gaotao0727 发表于 2014-7-17 11:42:33
太棒了,非常感谢~~~哈哈

报纸
gaotao0727 发表于 2014-7-17 11:43:14
freerunning_sky 发表于 2014-7-17 09:16
太棒了,非常感谢~~~哈哈

地板
gaotao0727 发表于 2014-7-21 15:49:07
freerunning_sky 发表于 2014-7-17 09:16
您好,再向您请教一下。假如A_cate里面的属性有很多,比如Attr1,Attr2,Attr3,Attr4...
就不想总是if scan(A_cate,2,"_")="Attr1" then Attr1_num=scan(A_cate,-1,"_");这样进行判断,因为很产生很多重复代码,想像类似下面这样:
%let AttrList=Attr1 Attr2 Attr3 Attr4;
data a_output;
        set a_input;
        array AttrList{*} &AttrList;
                do i=1 to dim(AttrList);
                if scan(A_cate,2,"_")="AttrList{i}" then do;
                                        Comm{i}_num=scan(A_cate,4,"_")*1;
                                        Comm{i}_level=scan(A_cate,-3,"_")*1;
                                        Comm{i}_level1=scan(A_cate,-1,"_")*1;
                                   end;
                end;
但是上面的代码报错,Comm{i}_num数组这样写不行,希望您给个类似的程序可以实现这个功能,非常感谢~~

7
freerunning_sky 在职认证  发表于 2014-7-21 17:14:18
gaotao0727 发表于 2014-7-21 15:49
您好,再向您请教一下。假如A_cate里面的属性有很多,比如Attr1,Attr2,Attr3,Attr4...
就不想总是if  ...
  1. data a;
  2.         input A_cate :$30. B_cate :$50. appl_id;
  3.         cards;
  4.         cate_Attr1_Num_24_level_0.77 cate_Bttr2_Num_10_Level_0.88_level1_0.99 1
  5.         cate_Attr2_Num_20_level_0.76 cate_Bttr3_Num_8_Level_0.66_level1_0.88 2
  6.                 cate_Attr3_Num_19_level_0.75 cate_Bttr4_Num_7_level_0.55_level1_0.77 3
  7.                 cate_Attr2_Num_18_level_0.74 cate_Bttr4_Num_6_level_0.44_level1_0.66 4
  8.         ;
  9. run;

  10. %macro trans;
  11. data b;
  12.         set a;
  13.         %do i=1 %to 4;
  14.                 if scan(A_cate,2,"_")="Attr&i" then do;
  15.                         Attr&i._num=scan(A_cate,-3,"_")*1;
  16.                         Attr&i._level=scan(A_cate,-1,"_")*1;
  17.                 end;else
  18.         %end;
  19.         ;
  20.         %do i=1 %to 4;
  21.                 if scan(B_cate,2,"_")="Bttr&i" then do;
  22.                         Bttr&i._num=scan(B_cate,-5,"_")*1;
  23.                         Bttr&i._level=scan(B_cate,-3,"_")*1;
  24.                         Bttr&i._level1=scan(B_cate,-1,"_")*1;
  25.                 end;else
  26.         %end;
  27.         ;
  28. run;
  29. %mend;
  30. %trans;
复制代码

8
freerunning_sky 在职认证  发表于 2014-7-21 17:58:11
gaotao0727 发表于 2014-7-21 15:49
您好,再向您请教一下。假如A_cate里面的属性有很多,比如Attr1,Attr2,Attr3,Attr4...
就不想总是if  ...
  1. data a;
  2.         input A_cate :$30. B_cate :$50. appl_id;
  3.         cards;
  4.         cate_Attr1_Num_24_level_0.77 cate_Bttr2_Num_10_Level_0.88_level1_0.99 1
  5.         cate_Attr2_Num_20_level_0.76 cate_Bttr3_Num_8_Level_0.66_level1_0.88 2
  6.                 cate_Attr3_Num_19_level_0.75 cate_Bttr4_Num_7_level_0.55_level1_0.77 3
  7.                 cate_Attr2_Num_18_level_0.74 cate_Bttr4_Num_6_level_0.44_level1_0.66 4
  8.         ;
  9. run;


  10. %Let Lpre=A B;
  11. %let Lvalue=NUM LEVEL LEVEL1;
  12. option mprint=yes;
  13. %macro trans;
  14. data b;
  15.         set a;
  16.         keep appl_id name value;
  17.         %do i=1 %to 2;
  18.                 %let pre=%scan(&Lpre.,&i.," ");
  19.                 %do j=1 %to 3;
  20.                         %let value=%scan(&Lvalue.,&j.," ");
  21.                         index=index(upcase(&pre._cate),"&value.");
  22.                         if index>0 then do;
  23.                                 tmp_name=upcase(scan(&pre._cate,2,"_"));
  24.                                 name=compress(tmp_name||"_&value.");
  25.                                 value=scan(substr(&pre._cate,index,length(&pre._cate)-index+1),2,"_");
  26.                                 output;
  27.                         end;
  28.                 %end;
  29.                 ;
  30.         %end;
  31.         proc sort;by appl_id;
  32. run;
  33. proc transpose data=b out=c(drop=_name_);
  34.         by appl_id;
  35.         id name;
  36.         var value;
  37. run;
  38. %mend;
  39. %trans;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

9
gaotao0727 发表于 2014-7-22 00:44:45
freerunning_sky 发表于 2014-7-21 17:58
代码写的真漂漂啊,非常感谢~~~

10
稳姐 发表于 2014-7-22 16:33:56
代码好刘碧的感觉但是为什么运行不了

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-24 15:25