SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3079|回复: 17
打印 上一主题 下一主题

如何用简单的方法实现

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-5-7 14:11:46 | 只看该作者

如何用简单的方法实现

数据库中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;
感觉繁琐,如何通过简单的方法实现?
谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-5-7 17:52:28 | 只看该作者

Re: 如何用简单的方法实现

肯定是用macro或者数组解决咯,但是没有发现x12与x1和x2的规律,能不能解释一下?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-5-7 18:01:15 | 只看该作者

Re: 如何用简单的方法实现

组合 但是其中1和2 与 2和1是一样的
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-5-7 18:26:18 | 只看该作者

Re: 如何用简单的方法实现

还是不懂,可能我比较愚钝。能不能解释的详细些,因为只有找到规律才能简化程序。
据个例子:比如X12=2X1-X2。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-5-7 20:46:09 | 只看该作者

Re: 如何用简单的方法实现

排列组合 x1有四个取值  x2有4个取值,一共有16中排列,但16中排列中类似1 2和2 1(1 3和3 1,1 4和4 1,2 3和3 2等)算作一种,最后剩下9种。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-5-9 20:29:44 | 只看该作者

Re: 如何用简单的方法实现

还是没有看明白,如果有看明白的TX请来帮助一下。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-5-12 17:52:08 | 只看该作者

Re: 如何用简单的方法实现

我理解的规则如下:
        1        2        3        4
1        1        2        3        4
2                5        6        7
3                        8        9
4                                10
以x1和X2为两个维度,做一个矩阵表,此矩阵是对称的,矩阵里的每个单元格放的数字是按照从左到右,从上到下的顺序存入
自然数序列。好像找不出来X12与X1和x2的具体数学关系。

但是程序怎么实现,我尝试了一下,没有搞定,请教高手
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-5-12 17:56:38 | 只看该作者

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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-5-14 15:07:42 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-5-15 17:01:59 | 只看该作者

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;
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 23:44 , Processed in 0.074270 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表