楼主: shirly_zhang
7211 10

[原创博文] 用SAS怎么剔除一符合条件的变量 [推广有奖]

  • 0关注
  • 4粉丝

已卖:67份资源

博士生

14%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
1.0000
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
10160 点
帖子
94
精华
0
在线时间
362 小时
注册时间
2010-4-16
最后登录
2022-4-28

楼主
shirly_zhang 发表于 2011-1-9 22:01:59 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
求助SAS程序:
在分析的数据中要剔除这样一类变量,变量的所有取值一样或都是空值。
二维码

扫码加我 拉你入群

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

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

关键词:sas程序 程序

回帖推荐

elek.me 发表于2楼  查看完整内容

写的比较仓促,你先测试一下吧。 只要是观测值全部相同,就去掉。

tiantianfrm 发表于8楼  查看完整内容

整体思路是:定义三组数组。第一组用来记录每一条观察,第二组数组(临时数组,具有retain功能),用来记录第一条观察。第三组观察,用来做标记:如果后面的观察跟第一条观察不同,标记数据就自动+1(累积语句,自动retain)。当最后一条的时候,用list 把那些观测都相同的,数组的名字,串在一起,用‘’隔开,同时赋给一个宏变量,因为是最后一条,不用retain

本帖被以下文库推荐

沙发
elek.me 发表于 2011-1-9 22:53:23
  1. data have;
  2.         input x0 $ x1-x4;
  3. cards;
  4. a 1 2 . 1
  5. b 2 2 . 1
  6. c 3 2 . 2
  7. ;


  8. %macro exclude;

  9. data _null_;
  10.         set have;
  11.         array char[*] _character_;
  12.         array num[*] _numeric_;
  13.         call symputx ("nchar",dim(char));
  14.         call symputx ("nnum",dim(num));
  15.         stop;
  16. run;

  17. data _null_;
  18.         set have end=eof;
  19.         length vars $ 32767;
  20.         retain vars "";
  21.         %if &nchar. >0 %then %do;
  22.                 array char[*] _character_;
  23.                 array char1[&nchar.] $ _temporary_;
  24.                 if _n_=1 then do;
  25.                         do i=1 to &nchar.;
  26.                                 char1[i]=char[i];
  27.                         end;
  28.                 end;
  29.                 else do;
  30.                         do ii=1 to &nchar.;
  31.                                 if char[ii]^=char1[ii] and find(vars,vname(char[ii]))=0 then vars=catx(" ",strip(vars),vname(char[ii]));
  32.                         end;
  33.                 end;
  34.         %end;
  35.         %if &nnum. >0 %then %do;
  36.                 array num[*] _numeric_;
  37.                 array num1[&nnum.] _temporary_;
  38.                 if _n_=1 then do;
  39.                         do j=1 to &nnum.;
  40.                                 num1[j]=num[j];
  41.                         end;
  42.                 end;
  43.                 else do;
  44.                         do jj=1 to &nnum.;
  45.                                 if num[jj]^=num1[jj] and find(vars,vname(num[jj]))=0 then vars=catx(" ",strip(vars),vname(num[jj]));
  46.                         end;
  47.                 end;
  48.         %end;
  49.         if eof then call execute ('data want;set have;keep '||strip(vars)||';run;');
  50. run;

  51. %mend;

  52. %exclude
复制代码


写的比较仓促,你先测试一下吧。 只要是观测值全部相同,就去掉。
我的博客: http://elek.me/sas
联系我: http://about.me/elek

藤椅
tiantianfrm 发表于 2011-1-10 22:30:49
select count(distinct name) into:num
from b;
select distinct name into:num1-:num%left(&num)
from from b;
quit;
%macro a;
%do i=1 %to #
proc sort data=a;
by num&i;
run;
data c&i;
set a;
by num&i;
if first.num&i. then do;first_num&i=num&i.; flg&i=0;end;
if num&i ne first_num&i then flg&i+1;
if last.num&i. and flg&i=0 then list&i=num&i;
run;
%end;
%mend a;

%macro b;
data d;
set a(drop= %do j=1 %to # list&j %end;);
run;
%mend b;
%b

板凳
shirly_zhang 发表于 2011-1-10 23:09:55
2# elek.me


运行了一下程序,还存在问题
提示错误:不允许混合隐式和显式数组下标

报纸
elek.me 发表于 2011-1-10 23:31:26
4# shirly_zhang 奇怪了。   数组定义时的
  1. [*]
复制代码
都被自动抹去了,不知道怎么原因,我现在已经修改过了,你再试试吧。应该没有问题的
我的博客: http://elek.me/sas
联系我: http://about.me/elek

地板
tiantianfrm 发表于 2011-1-11 22:09:19
data have;
        input x0 $ x1-x4;
cards;

a 1 2 . 1

a 2 2 . 1

a 3 2 . 2

;
data _null_;
      if 0  then  set have;
        array cha[*] _character_;
        array num[*] _numeric_;
        call symputx ("nchar",dim(char));
        call symputx ("nnum",dim(num));
        stop;
run;

data _null_;
       set have end=last;
     array cha[*] _character_;
     array num[*] _numeric_;
array first_cha(&nchar) _temporary_;
array first_num(&nchar) _temporary_;
array flg_cha(&nchar) (&nchar*0);
array flg_num(&nnum) (&nnum*0);
length list $100;
if _n_=1 then do;
do i=1 to &nchar;
first_cha(i)=cha[i];
end;
do i=1 to &nnum;
first_num(i)=num[i];
end;
end;
do i=1 to &nchar;
if cha[i] ne first_cha(i) then flg_cha(i)+1;
end;
do i=1 to &nnum;
if num[i] ne first_num(i) then flg_num(i)+1;
end;
if last=1 then do;
do i=1 to &nchar;
if flg_cha(i)=0 then list=catx('',list,vname(cha[i]));
end;
do i=1 to &nnum;
if flg_num(i)=0 then list=catx('',list,vname(num[i]));
end;
call symput ('mlist',list);
end;
run;
data have;
set have (drop=&milst);
run;

7
shirly_zhang 发表于 2011-1-11 22:10:54
5# elek.me

恩,可以了,高手。。。

8
tiantianfrm 发表于 2011-1-11 22:15:42
整体思路是:定义三组数组。第一组用来记录每一条观察,第二组数组(临时数组,具有retain功能),用来记录第一条观察。第三组观察,用来做标记:如果后面的观察跟第一条观察不同,标记数据就自动+1(累积语句,自动retain)。当最后一条的时候,用list 把那些观测都相同的,数组的名字,串在一起,用‘’隔开,同时赋给一个宏变量,因为是最后一条,不用retain
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

9
shirly_zhang 发表于 2011-1-11 22:18:13
6# tiantianfrm

貌似有错误。。。

10
456852 发表于 2011-1-12 18:00:44
如果是我的话,我用个means然后把左右std=0的都取出来,然后drop.

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 23:19