楼主: raymonica
1741 9

[原创博文] [求助]:变量处理 [推广有奖]

  • 0关注
  • 1粉丝

硕士生

15%

还不是VIP/贵宾

-

威望
0
论坛币
23 个
通用积分
0
学术水平
2 点
热心指数
2 点
信用等级
0 点
经验
1277 点
帖子
238
精华
0
在线时间
43 小时
注册时间
2008-10-1
最后登录
2012-6-21

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位高手:
我有一组数据,有七个不同的变量 (变量名不规则)。 我需要对变量作俩俩乘积。
希望编程序自动生成结果。类似:
i=1.. n
j=1.. n
newvar=var_i * var_j;
i<>j

希望高人指点。
多谢了。
二维码

扫码加我 拉你入群

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

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

关键词:变量处理 自动生成 高人指点 VaR 编程序 程序

回帖推荐

wanna_sas 发表于10楼  查看完整内容

我试验的最终版本是: options mprint mlogic symbolgen ; proc sql; select name into :vname separated by " " from sashelp.vcolumn where libname='xxxx and memname='xxxx' and varnum>2; run; quit; %put &vname; %macro namecreate; %let onames=&vname; %global _name_; %let i=1; %let _name_=; %let newname=; %do%while (&i

bobguy 发表于6楼  查看完整内容

Here is the simplest way do it. HTH. data t1; x1=1;x2=2;x3=3;x4=4; run; data t2; set t1; array x(*) x1-x4; array y( 6); do i= 1 to dim(x)-1; do j= i+1 to dim(x); n+1; y(n)=x(i)*x(j); end; end; drop i j n; run; proc print; run; ************************************************* Obs x1 x2 x3 x4 y1 y2 y3 y4 y5 y6 ...

jingju11 发表于2楼  查看完整内容

1# raymonica

本帖被以下文库推荐

沙发
jingju11 发表于 2009-11-24 08:43:57 |只看作者 |坛友微信交流群
1# raymonica


  1. data original;
  2. input a b c d e f g;
  3. cards;
  4. 1 2 3 4 5 6 7
  5. 2 3 4 5 6 7 8
  6. ;
  7. /*create a name product-name list*/
  8. %macro nameMcr;
  9. %let Names =a b c d e f g;
  10. %global _name_;
  11. %let i =1;  %let _name_=;
  12. %do%while( &i <=7);
  13.   %let j =1;
  14.    %do%while( &j <=7);
  15.      %if &j >&i %then %let _name_ =&_name_ %scan(&names, &i)_%scan(&names, &j);
  16.      %let j =%eval(&j+1);
  17.     %end;
  18.     %let i =%eval(&i+1);
  19. %end;
  20. %mend nameMcr;
  21. %nameMcr
  22. ;
  23. data product;
  24. set original;
  25. array vAry{7} a--g;
  26. array pAry{21} &_name_;
  27. n=0;
  28. do i =1 to 7;
  29.   do j =1 to 7;
  30.    if j >i then
  31.     do;
  32.      n+1;
  33.      pAry[n] =vAry[i] *vAry[j];
  34.     end;
  35.   end;
  36.   end;
  37. drop n i j;
  38. run;
  39. /*Be aware: any combination of 2 variable names has <32 characters;*/
复制代码
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

使用道具

藤椅
qzuxwj138 发表于 2009-11-24 09:42:00 |只看作者 |坛友微信交流群
data a;
do i=1 to 7;
do j=1 to 7;
if i^=j then output;
end;
end;
run;
proc sql;
create table final as
select *,(i*j) as newvar from a where i<>j;
quit;

使用道具

板凳
qzuxwj138 发表于 2009-11-24 09:42:56 |只看作者 |坛友微信交流群
不好意思,做的是错的,别介意啊!

使用道具

报纸
freeseaman 发表于 2009-11-25 02:18:52 |只看作者 |坛友微信交流群
多谢牛人指点。回去好好调试。

使用道具

地板
bobguy 发表于 2009-11-25 22:07:57 |只看作者 |坛友微信交流群
Here is the simplest way do it.

HTH.

data t1;
  x1=1;x2=2;x3=3;x4=4;
run;

data t2;
  set t1;
  array x(*) x1-x4;
  array y( 6);
  do i= 1 to dim(x)-1;
     do j= i+1 to dim(x);
         n+1;
          y(n)=x(i)*x(j);
          end;
  end;
  drop i j n;
run;

proc print; run;

*************************************************
Obs    x1    x2    x3    x4    y1    y2    y3    y4    y5    y6

  1      1     2     3     4     2     3     4     6     8    12
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

使用道具

7
huage 发表于 2009-11-25 22:24:13 |只看作者 |坛友微信交流群
# jingju11 写的不错的.
如果说有点可以改进的话,就是自动把dataset的变量读出来, 省掉外部输入.

使用道具

8
whfqsj 发表于 2009-11-27 23:26:51 |只看作者 |坛友微信交流群
恩,不错,我也是这样认为的

使用道具

9
wanna_sas 发表于 2009-11-28 00:11:30 |只看作者 |坛友微信交流群
高人呀,深受启发。我要好好试一试。

使用道具

10
wanna_sas 发表于 2009-11-28 03:50:57 |只看作者 |坛友微信交流群
我试验的最终版本是:
options mprint mlogic symbolgen  ;

proc sql;
select name into :vname separated by " "
from sashelp.vcolumn
where libname='xxxx
and memname='xxxx'
and varnum>2;
run;
quit;

%put &vname;


%macro namecreate;
%let onames=&vname;
%global _name_;
%let i=1;
%let _name_=;
%let newname=;
%do%while (&i<=7);
  %let j=1;
     %do%while (&j<=7);
       %if &j>&i %then
         %let _name_=&_name_ %scan(&onames,&i)_%scan(&onames,&j);               
   %let j=%eval(&j+1);
%end;
%let i=%eval(&i+1);
%end;
%mend namecreate ;
%namecreate
;



data xxxx ;
set xxxx ;
array orig{7} &vname;
array comb{21} &_name_;
n=0;
do i=1 to dim(orig)-1;
  do j=i+1 to dim(orig);
  n+1;
  comb[n]=orig[i]*orig[j];
  end;
  end;
  drop i j n;
  run;

看各位有没有更好的想法。
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

使用道具

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

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

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

GMT+8, 2024-5-21 21:11