SAS中文论坛

标题: 如何用简单的方法实现 [打印本页]

作者: shiyiming    时间: 2008-5-7 14:11
标题: 如何用简单的方法实现
数据库中x1 x2取值分别为1 2 3 4
if x1=1 and x2=1 then x12=1;
if x1=1 and x2=2 then x12=2;
if x1=1 and x2=3 then x12=3;
if x1=1 and x2=4 then x12=4;

if x1=2 and x2=1 then x12=2;
if x1=2 and x2=2 then x12=5;
if x1=2 and x2=3 then x12=6;
if x1=2 and x2=4 then x12=7;

if x1=3 and x2=1 then x12=3;
if x1=3 and x2=2 then x12=6;
if x1=3 and x2=3 then x12=8;
if x1=3 and x2=4 then x12=9;

if x1=4 and x2=1 then x12=4;
if x1=4 and x2=2 then x12=7;
if x1=4 and x2=3 then x12=9;
if x1=4 and x2=4 then x12=10;
感觉繁琐,如何通过简单的方法实现?
谢谢!
作者: shiyiming    时间: 2008-5-7 17:52
标题: Re: 如何用简单的方法实现
肯定是用macro或者数组解决咯,但是没有发现x12与x1和x2的规律,能不能解释一下?
作者: shiyiming    时间: 2008-5-7 18:01
标题: Re: 如何用简单的方法实现
组合 但是其中1和2 与 2和1是一样的
作者: shiyiming    时间: 2008-5-7 18:26
标题: Re: 如何用简单的方法实现
还是不懂,可能我比较愚钝。能不能解释的详细些,因为只有找到规律才能简化程序。
据个例子:比如X12=2X1-X2。
作者: shiyiming    时间: 2008-5-7 20:46
标题: Re: 如何用简单的方法实现
排列组合 x1有四个取值  x2有4个取值,一共有16中排列,但16中排列中类似1 2和2 1(1 3和3 1,1 4和4 1,2 3和3 2等)算作一种,最后剩下9种。
作者: shiyiming    时间: 2008-5-9 20:29
标题: Re: 如何用简单的方法实现
还是没有看明白,如果有看明白的TX请来帮助一下。
作者: shiyiming    时间: 2008-5-12 17:52
标题: Re: 如何用简单的方法实现
我理解的规则如下:
        1        2        3        4
1        1        2        3        4
2                5        6        7
3                        8        9
4                                10
以x1和X2为两个维度,做一个矩阵表,此矩阵是对称的,矩阵里的每个单元格放的数字是按照从左到右,从上到下的顺序存入
自然数序列。好像找不出来X12与X1和x2的具体数学关系。

但是程序怎么实现,我尝试了一下,没有搞定,请教高手
作者: shiyiming    时间: 2008-5-12 17:56
标题: Re: 如何用简单的方法实现
前面的矩阵发错了,应该这样
维度  1  2  3   4
   1    1  2  3   4
   2    2  5  6   7
   3    3  6  8   9
   4    4  7  9   10
作者: shiyiming    时间: 2008-5-14 15:07
标题: Re: 如何用简单的方法实现--这样可行
/*目标数据集*/
data data1;
input x1;
cards;
1
2
3
4
;
run;
data data2;
input x2;
cards;
1
2
3
4
;
run;
/*产生两两交叉表*/
data data3;
set data1;
do i=1 to n;
  set data2 nobs=n point=i;
  output;
end;
run;
/*对两两交叉表的同一组合打上标签*/
data data3;
set data3;
if x1>x2 then do;
              flag_1=x1;
                          flag_2=x2;
                          end;
else do;
     flag_1=x2;
     flag_2=x1;
         end;
run;
/*对两两交叉表的唯一记录按照顺序赋予自然数序列*/
proc sort data=data3 out=data4(drop=x1 x2) nodupkey;
by flag_2 flag_1;
run;
data data4(rename=(i=x12));
do i=1 to n;
set data4 nobs=n;
output;
end;
run;
/*将含有同一组合的两两交叉表和唯一记录的两两交叉表合并*/
proc sort data=data3;
by flag_2 flag_1;
run;
data data5(drop= flag_2 flag_1);
merge data3
      data4;
by flag_2 flag_1;
run;
结合前面帖子对于规则的解释,希望这个是你想要的 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2008-5-15 17:01
标题: Re: 如何用简单的方法实现
以下代码可以实现你需要的功能,但是代码的行数并不少,只是看起来逻辑一点罢了. Hope it helps!

data a;
input x1@@;
do i=1 to 4;
x2=i;
output;
end;
keep x1 x2;
cards;
1 2 3 4
;
run;

data a1;
set a;
select(x1);
when(1) select(x2);
   when(1) x12=1;
   when(2) x12=2;
   when(3) x12=3;
   when(4) x12=4;
   otherwise;
   end;
when(2) select(x2);
   when(1) x12=2;
   when(2) x12=5;
   when(3) x12=6;
   when(4) x12=7;
   otherwise;
   end;
when(3) select(x2);
   when(1) x12=3;
   when(2) x12=6;
   when(3) x12=8;
   when(4) x12=9;
   otherwise;
   end;
when(4) select(x2);
   when(1) x12=4;
   when(2) x12=7;
   when(3) x12=9;
   when(4) x12=10;
   otherwise;
   end;
otherwise;
end;
run;
作者: shiyiming    时间: 2008-5-16 00:37
标题: Re: 如何用简单的方法实现
[code:1e0msw55]data ahuige;
  do x1=1 to 4;
    do x2=1 to 4;
    output;
    end;
  end;
run;
data ahuige(keep=x&#58;);  
  set ahuige;
  array arr(1&#58;4,1&#58;4)
(
1
2
3
4

2
5
6
7

3
6
8
9

4
7
9
10
);
  x12=arr(x1,x2);
run;[/code:1e0msw55]
作者: shiyiming    时间: 2008-5-16 21:10
标题: Re: 如何用简单的方法实现
如何简单得到后面的产生值呢?
如果x1和x2分别为1 2 3 4 5 6 7 8 9呢?
作者: shiyiming    时间: 2008-5-19 13:02
标题: Re: 如何用简单的方法实现
[code:1ki9jveb]
data a;
        do x1=1 to 4;
                do x2=1 to 4;
                        output;
                end;
        end;
run;
data b;
        set a;
        if x1=4 and x2=4 then x12=10;
        if x1=3 then x12=x2+5;
        if x2=3 then x12=x1+5;
        if x1=2 then x12=x2+3;
        if x2=2 then x12=x1+3;
        if x1=1 then x12=x2;
        if x2=1 then x12=x1;
run;
[/code:1ki9jveb]
作者: shiyiming    时间: 2008-5-19 14:00
标题: Re: 如何用简单的方法实现
根据烟酒生的矩阵提示:可以生成任意数列,n=4,5,6,7,8,9。。。。。。。。
[code:1jrjqa9f]
%let n=9;
data a;
        do x1=1 to &amp;n;
                do x2=1 to &amp;n;
                        output;
                end;
        end;
run;
data b;
        set a;
        tem1=0;
        do j=1 to x1;
                tem1+(&amp;n-(j-1));
        end;
        tem1=tem1-&amp;n;
        tem2=0;
        do j=1 to x2;
                tem2+(&amp;n-(j-1));
        end;
        tem2=tem2-&amp;n;
        do i=&amp;n to 1 by -1;
                if x1=i then x12=x2+tem1;
                if x2=i then x12=x1+tem2;
        end;
run;
proc transpose data=b out=c prefix=x2;
        by x1;
        var x12;
run;
[/code:1jrjqa9f]
作者: shiyiming    时间: 2008-6-4 15:30
标题: Re: 如何用简单的方法实现
ls的做法不错,我也写了一个,不过我的想法是将1至n的数字放入相应的位置中。下面的4可以相应地改为5,6,7,etc。
[code:14r6byxa]data a(keep=i j k);        
        t=1;        
        do i=1 to 4; do j=1 to 4;        
        if j&gt;=i then do k=t;t+1; end; else k=0;
        output;        end;end;
        t=1;
        do j=1 to 4; do i=1 to 4;
        if i&gt;=j then do k=t; t+1; end;else k=0;
        output; end;end;
run;
proc sort data=a;
       by i j;
run;
   
data b(keep=i j q);
        set a;
        retain q 0;
        if i=j then q=k;
        else if first&#46;j=1  then q=k;else q+k;
        by i j;
        if last&#46;j;
run;  
proc print; run;
[/code:14r6byxa]
作者: shiyiming    时间: 2008-6-4 22:41
标题: Re: 如何用简单的方法实现
[code:14a8a2mi]/* 创建模拟数据集 */
data test;
    do x1=1 to 4;
        do x2=1 to 4;
            output;
        end;
    end;
run;
/* 创建输出格式 */
proc format;
    value x1_fmt 1='x2_1_fmt'
                 2='x2_2_fmt'
                 3='x2_3_fmt'
                 4='x2_4_fmt'
                 ;
    value x2_1_fmt 1=1
                   2=2
                   3=3
                   4=4
                   ;
    value x2_2_fmt 1=2
                   2=5
                   3=6
                   4=7
                   ;
    value x2_3_fmt 1=3
                   2=6
                   3=8
                   4=9
                   ;
    value x2_4_fmt 1=4
                   2=7
                   3=9
                   4=10
                   ;
run;
/* 创建新变量 */
data test1(drop=temp);
    set test;
    temp=put(x1,x1_fmt&#46;);
    x12=input(putn(x2,temp),2&#46;);
run;[/code:14a8a2mi]
作者: shiyiming    时间: 2008-6-4 22:52
标题: Re: 如何用简单的方法实现
ls的做法只适用于n=4的情况,请问若要产生一个n=10的满足条件的数据集或是矩阵,那该怎么办哪?
作者: shiyiming    时间: 2008-6-21 12:08
标题: Re: 如何用简单的方法实现
我发现了一点点规律,发表在我自己的论坛上了,有兴趣的朋友过来看下吧!

[url:3sw2vhey]http&#58;//www&#46;businessanalysis&#46;cn/viewthread&#46;php?tid=3786&amp;page=1&amp;extra=page%3D1#pid8833[/url:3sw2vhey]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2