楼主: sonicsallen
9760 9

[原创博文] [求教]SAS 删除变量 [推广有奖]

  • 0关注
  • 0粉丝

大专生

50%

还不是VIP/贵宾

-

威望
0
论坛币
14 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
188 点
帖子
28
精华
0
在线时间
75 小时
注册时间
2009-3-30
最后登录
2018-9-9

楼主
sonicsallen 发表于 2010-4-26 09:32:42 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
一个dataset有很多个变量,其中有些变量的值对于所有记录都是0
怎样写代码,自动删除这些变量?
谢谢
二维码

扫码加我 拉你入群

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

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

关键词:dataset DataS 多个变量 Data TAS 记录

回帖推荐

pandasasa 发表于3楼  查看完整内容

data a; input x y z h; cards; 1 2 0 0 2 4 0 0 4 5 0 0 ; proc sql noprint; select name into:vname separated by ' ' from dictionary.columns where libname='WORK' and memname='A' and type='num'; quit; %put &vname; %macro zero; %let i=1; %do %while(%length(%scan(&vname,&i))>0); %let name=%scan(&vname,&i); proc sql noprint; select sum(&name) into :num from a; quit; data a; ...

本帖被以下文库推荐

沙发
anzhiliang 发表于 2010-4-26 09:49:42
我也想问关于观测的一些特殊属性怎样对变量进行修改

藤椅
pandasasa 发表于 2010-4-26 10:07:16

删除记录全为0的变量

data a;
input x y z h;
cards;
1 2 0 0
2 4 0 0
4 5 0 0
;
proc sql noprint;
select name into:vname separated by ' '
from dictionary.columns
where libname='WORK' and memname='A' and type='num';
quit;
%put &vname;
%macro zero;
%let i=1;
%do %while(%length(%scan(&vname,&i))>0);
%let name=%scan(&vname,&i);
proc sql noprint;         
select sum(&name) into :num
from a;
quit;
data a;
set a;
%if &num=0 %then %do;
drop &name;
%end;
run;
%let i=%eval(&i+1);
%end;
%mend;
%zero;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

板凳
crackman 发表于 2010-4-26 12:05:16
全部用DATA步完成,不需要调用复杂的宏程序以及SQL,效率要高些。
data crackman;
fen="woody";
wodu="sinacom";
do i=1 to 100;
x=ranuni(90);
y=x*1.567;
z=x+y;
m=0;
output;
end;
run;
data a;
set crackman;
keep _numeric_;
call symput('obs',compress(attrn(open('work.a','i'),'nobs')));
run;
data b;
set crackman;
keep _character_;
run;
proc transpose data=a out=c;
var _all_;
run;
data c;
set c;
array s col1-col&obs.;
if col1-col&obs.^=0 then output;
run;
proc transpose data=c out=c;
ID _NAME_;
run;
data c;
set c;
drop _name_;
run;
data result;
merge  c b;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
anzhiliang + 1 + 1 + 1 我很赞同

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
sushe1527 发表于 2010-4-26 13:56:04
如何保证结果变量的顺序和原表一样呢?这个把字符型提前了

地板
crackman 发表于 2010-4-26 14:07:25
因为我的字符型变量值是一个值
所以转置的时候出现问题
如果不是一个值
也许可以直接转就可以了
不需要分字符型和数值型了

7
sushe1527 发表于 2010-4-26 14:20:07
额是的 我就是问下在字符和数字混合的情况下怎么能保证结果和原始表的变量顺序一样

8
crackman 发表于 2010-4-26 14:31:03
你就不分数值和字符啊
直接转过去转过来
我觉得应该不会有变化
你测试一下

9
jingju11 发表于 2010-4-27 02:29:36
1# sonicsallen

不同的人不同的想法因此不同的解决方法。我觉得这个问题实际意义不大,但是可以向以上各位学习很多。我的想法是
  1. DATA A;
  2. INPUT X1 X2 X3 $ X4; DATALINES;
  3. 1 0 a 0
  4. 0 0 c .
  5. 4 0 0  0
  6. ;
  7. DATA _NULL_;
  8. LENGTH STRING $256;SET A END = Eof;
  9. ARRAY _x_{*} _NUMERIC_; ARRAY SUM{99} _TEMPORARY_;   
  10. DO I = 1 TO DIM(_x_);
  11.   SUM[I]+(_x_[I]);
  12.   END;
  13. IF Eof THEN DO;
  14.   DO I = 1 TO DIM(_x_);
  15.    IF (NOT SUM[I]) THEN STRING = CATX(' ', STRING, VNAME(_x_[I]));
  16.    END;
  17.    CALL SYMPUTX('DeVars', STRING);
  18.   END;
  19. RUN;
  20. DATA DeA; SET A(DROP = &DeVars);
  21. RUN;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
crackman + 1 + 1
sonicsallen + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

10
sonicsallen 发表于 2010-4-27 08:58:39
非常感谢LS几位的解答

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

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