楼主: liuliuqiu
1267 4

[有偿编程] SAS程序求教 [推广有奖]

  • 6关注
  • 2粉丝

副教授

62%

还不是VIP/贵宾

-

威望
0
论坛币
2340 个
通用积分
8.9561
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
14393 点
帖子
429
精华
0
在线时间
1113 小时
注册时间
2009-3-24
最后登录
2024-2-29

5论坛币
请教sas程序,假设有下列数据,这是双向关系数据表,本应该是n*n的数据模式,但因为数据问题,导致列变量缺少,现在想做的是把他变成N*n的形式,也就是添加a1,a5,a6,a8,a9,a12,a13列,数值可以直接设为0。
这个数据表我列的比较简单,真实的数据是行有200+,列有100+,所以手工添加列变化过于复杂,恳请各位指教,谢谢!
a2a3 a4a7a10a11
a1

0

C

0

9

a2

0.023885

C

0

0.9

a3C

0

C

0

19.6

a4

0

C

0

3864.6

a5

0

C

0

0

a6

0

C

0

0.8

a7

0

C

0

48.86

a8

0

C

0

1.07

a9

13.37665

1450.292

CC

125.9

15.76924

a10

0

C

0

12.7

a11

0

C

0

0

a12

4921.651

484.6763

2089.356

21.2938

4922.8

10.55057

a13

402.2549

379.3032

CC

2022.1



关键词:数据表 程序 手工
沙发
zwnSAS121 发表于 2017-3-31 17:48:49 |只看作者 |坛友微信交流群
  1. /*解决实际问题之填补缺失的列变量*/
  2. data nm;
  3. input name $ a2 a3 a4$ a7;
  4. cards;
  5. a1 . 0    c    0
  6. a2 . 0.23 c    0
  7. a3 c 0    c    0
  8. a4 . 0    c    0
  9. a5 . 0    c    0
  10. a6 . 0    c    1
  11. a7 . 0    c    1
  12. ;

  13. /*取列变量name所有的值*/
  14. proc sql noprint;
  15. select name into :rowname separated by ' '
  16. from nm;
  17. quit;

  18. %put &rowname;

  19. /*删除列变量名name*/
  20. data nm1;
  21. set nm;
  22. drop name;
  23. run;

  24. /*取列变量名在行变量名(总集)的缺失变量值*/
  25. proc contents data=nm1 out=list;run;
  26. proc sql noprint;
  27. create table short as
  28. select name
  29. from nm
  30. where name not in (select name from list);
  31. quit;

  32. /*将缺失变量名赋值给宏变量*/
  33. proc sql noprint;
  34. select name into :shortname separated by ' '
  35. from short;
  36. quit;

  37. %put &shortname;

  38. /*讲新增变量(缺失变量)赋值为0*/
  39. data nn;
  40. set nm;
  41. retain &shortname 0;
  42. run;

  43. /*排序和观测变量名一致,即得到NxN方阵(矩阵)*/
  44. data nn;
  45. retain name &rowname;
  46. set nn;
  47. run;
复制代码

使用道具

藤椅
liuliuqiu 发表于 2017-3-31 19:47:13 |只看作者 |坛友微信交流群
各位帮帮忙,求解答

使用道具

板凳
isaaclin007 发表于 2017-4-1 15:49:27 |只看作者 |坛友微信交流群
data t;
        array a[*] a1-a13;
        do i = 1 to dim(a);
                a[i] = 1;
        end;
run;

可以考虑用这种数组,细节要把字符型和数值型分开,你自己研究下

使用道具

报纸
zwnSAS121 发表于 2017-4-1 19:46:20 |只看作者 |坛友微信交流群
/*请教sas程序,假设有下列数据,这是双向关系数据表,
本应该是n*n的数据模式,但因为数据问题,导致列变量缺少,
现在想做的是把他变成N*n的形式,也就是添加a1,a5,a6,a8,a9,a12,a13列,
数值可以直接设为0。这个数据表我列的比较简单,真实的数据是行有200+,
列有100+,所以手工添加列变化过于复杂,恳请各位指教,谢谢!*/

/*解决实际问题之填补缺失的列变量*/
data nm;
input name  $  a2  a3  a4  $   a7;
cards;
a1 . 0    c    0
a2 . 0.23 c    0
a3 c 0    c    0
a4 . 0    c    0
a5 . 0    c    0
a6 . 0    c    1
a7 . 0    c    1
;

/*取列变量name所有的值*/
proc sql noprint;
select name into :rowname separated by ' '
from nm;
quit;

%put &rowname;

/*删除列变量名name*/
data nm1;
set nm;
drop name;
run;

/*取列变量名在行变量名(总集)的缺失变量值*/
proc contents data=nm1 out=list;run;
proc sql noprint;
create table short as
select name
from nm
where name not in (select name from list);
quit;

/*将缺失变量名赋值给宏变量*/
proc sql noprint;
select name into :shortname separated by ' '
from short;
quit;

%put &shortname;

/*讲新增变量(缺失变量)赋值为0*/
data nn;
set nm;
retain &shortname 0;
run;

/*排序和观测变量名一致,即得到NxN方阵(矩阵)*/
data nn;
retain name &rowname;
set nn;
run;

填补缺失的列变量名.txt

1.2 KB

填补缺失变量

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 11:36