标题: 如何用简单的方法实现 [打印本页] 作者: 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;
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 &n;
do x2=1 to &n;
output;
end;
end;
run;
data b;
set a;
tem1=0;
do j=1 to x1;
tem1+(&n-(j-1));
end;
tem1=tem1-&n;
tem2=0;
do j=1 to x2;
tem2+(&n-(j-1));
end;
tem2=tem2-&n;
do i=&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>=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>=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.j=1 then q=k;else q+k;
by i j;
if last.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.);
x12=input(putn(x2,temp),2.);
run;[/code:14a8a2mi]作者: shiyiming 时间: 2008-6-4 22:52 标题: Re: 如何用简单的方法实现 ls的做法只适用于n=4的情况,请问若要产生一个n=10的满足条件的数据集或是矩阵,那该怎么办哪?作者: shiyiming 时间: 2008-6-21 12:08 标题: Re: 如何用简单的方法实现 我发现了一点点规律,发表在我自己的论坛上了,有兴趣的朋友过来看下吧!