全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
702 5
2023-07-05
悬赏 80 个论坛币 未解决
传递两个macro变量
x为1 2 3 4
ctrl为1 或2 或1 2


希望得到新的宏变量




假设参比ctrl为1,剩下为2 3 4,构造出 一个宏变量为:
                           "2 vs 1"  -1 1 0 0,
                           "3 vs 1" -1 0 1 0,
                           "4 vs 1" -1 0 0 1


假设参比ctrl为2,剩下为1 3 4,构造出 一个宏变量为:
                          "1 vs 2"  1 -1 0 0,
                          "3 vs 2"  0 -1 1 0,
                          "4 vs 2"  0- 1  0 1


假设参比ctrl为1 2,剩下为3 4,构成出一个宏变量为:
                          "3 vs 1" -1 0 1 0,
                          "4 vs 1" -1 0 0 1,
                          "3 vs 2"  0 -1 1 0,
                          "4 vs 2" 0- 1  0 1

二维码

扫码加我 拉你入群

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

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

全部回复
2023-7-7 13:54:09
可以借助循环与数组完成:
复制代码


调用示例如下:
复制代码


你或许可以完全改用宏语句实现,就更为方便了。
二维码

扫码加我 拉你入群

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

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

2023-7-10 19:39:56
假设参比ctrl为1 2,
ctrl为1,2 3 4
ctrl为2,3 4      (注2和1已比过)
构成出一个宏变量为:
                          "2 vs 1" -1 1 0 0,
                          "3 vs 1" -1 0 1 0,
                          "4 vs 1" -1 0 0 1,
                          "3 vs 2"  0 -1 1 0,
                          "4 vs 2" 0- 1  0 1
二维码

扫码加我 拉你入群

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

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

2023-7-10 19:43:23
如果是&x为1 2 3 4,&ctrl为1 或2 或1 2。
当ctrl为1时,需得到的宏变量y为1-2!1-3!1-4
当ctrl为2时,需得到的宏变量y为2-1!2-3!2-4
当ctrl为1 2时,需得到的宏变量y为1-2!1-3!1-4!2-3!2-4

二维码

扫码加我 拉你入群

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

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

2023-8-3 14:44:14
二维码

扫码加我 拉你入群

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

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

2023-8-25 21:55:24
参考whymath的code,稍微修改了点code如下,
%macro tri_vs_ctrl(total=,ctrl=);
%local tri;
%global _rst_;
%let tri=&total.;
%let _rst_=;
%do i=1 %to %sysfunc(countw(&ctrl));
  %let num_i = %scan(&ctrl, &i);
  %let tri=%cmpres(%sysfunc(compress(&tri,%sysfunc(compress(&num_i)))));
  %do j=1 %to %sysfunc(countw( &tri ));
    %let num_j = %scan(&tri, &j);
    data _NULL_;
      length text $1024.;
      text=catx('!', "&_rst_.", catx('-', &num_i, &num_j));
      call symputx('_rst_',text);
    run;
  %end;
%end;
%put &=_rst_;
%mend;

结果
%tri_vs_ctrl(total=1 2 3 4,ctrl=1);
output: _RST_=1-2!1-3!1-4

%tri_vs_ctrl(total=1 2 3 4,ctrl=2);
output:_RST_=2-1!2-3!2-4

%tri_vs_ctrl(total=1 2 3 4,ctrl=1 2);
ouptut:_RST_=1-2!1-3!1-4!2-3!2-4

二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群