楼主: gavin4403
1761 11

紧急跪求高手指点。。。。。 [推广有奖]

  • 2关注
  • 0粉丝

博士生

27%

还不是VIP/贵宾

-

威望
0
论坛币
640 个
通用积分
6.8330
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
4450 点
帖子
171
精华
0
在线时间
232 小时
注册时间
2007-4-27
最后登录
2023-11-26

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位大侠,我的原始数据如下所示:
         X   Y
        1   1
        2   2
        3   3
        4   4
        5   5
         ···
        ···
      99  99
由于Y总共有99个值,所以,我想生成Y01到Y99,然后,只有当Y的取值,与Y0n中n的值相同的行列交点处的值才能取1,否则,只能取0。也就是要形成这样的表格
         X                Y                H01           H02            H03          H04········
         1                 1                1                 0               0                0  ·······
         2                 2                0                1                 0                0 ········
         3               3                0                  0                1                 0········
         4                 4                0                  0                0               1 ·········
····································
····················································
感觉需要用到很复杂的宏技术,所以,跪求高手指点,跪求指点。谢谢。谢谢。跪求。跪求。。。

二维码

扫码加我 拉你入群

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

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

关键词:高手指点 求高手 各位大侠 跪求指点 原始数据

沙发
gavin4403 发表于 2015-4-20 08:39:11 |只看作者 |坛友微信交流群
我想表达的意思是,Y代表分类变量。这个数据集按照Y分成了99类。从而,我想使用0-1哑变量来表征Y的分类。比如第一行,Y01等于1,Y02——Y99都等于0的话,就表示Y的取值为1。再比如第二行,Y02=1,Y01以及Y03——Y99都等于0的话,就表示Y的取值为2。依次类推。在第99行,Y01——Y98都取0,Y99=1,则代表Y的取值为1。是这个意思。在SAS中,假设原文件存储在tt数据集中。我产生目标数据集的方法如下,很麻烦。
Data  tt;
    set tt;
     Y01=.;

使用道具

藤椅
gavin4403 发表于 2015-4-20 08:45:17 |只看作者 |坛友微信交流群
我原来使用的很麻烦的方法是:
Data tt;
      set tt;
     Y01=.;
     Y02=.;
      Y03=.;
      ·····
      Y99=.;
RUN;
Data tt;
       set tt;
       if Y=1 then Y01=1;
       IF y=1 then Y02=0;
      if Y=1   then y03=0;
············
       if Y=1  then Y99=0;
       IF y=2  THEN  y01=0;
       if y=2   then y02=1;
       if y=2  then y03=.;
      ··········
       if y=2 then y99=0;
··········
        if y=99 then y01=0;
       if y=99  then y02=0;
···········
        if y=99 then y98=0;
        if y=99 then y99=1;
run;
这样就得到了我想要的结果。但是,这很麻烦。我感觉可以用一个简单的宏技术就能解决,所以,跪求高手指点迷津。

      

使用道具

  1. data a ;
  2.     do x  = 1 to 99; y=x;output; end;
  3. run;
  4. proc sql;
  5.     select count(y) into : nobs from a ;
  6. quit;

  7. data b ;
  8.     set a ;
  9.     array h[&nobs]  ;
  10.     do i = 1 to &nobs;
  11.        if i=_n_ then h[i] =1 ;
  12.        else h[i] = 0 ;
  13.     end;
  14.     drop i;
  15. run;
复制代码
hope this will help you

使用道具

报纸
gavin4403 发表于 2015-4-20 11:45:41 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-4-20 09:54
hope this will help you
太好了。解决了。谢谢。谢谢

使用道具

地板
gavin4403 发表于 2015-4-20 11:46:57 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-4-20 09:54
hope this will help you
太好了。解决了。谢谢。谢谢

使用道具

7
learsaas 发表于 2015-4-20 17:18:49 |只看作者 |坛友微信交流群
proc iml;
        A=(1:99)`||(1:99)`;
  B=J(A[<>,1],A[<>,2],0);
  do i=1 to nrow(A);
   B[A[i,1],A[i,2]]=1;
  end;
  print B;
quit;

使用道具

8
gavin4403 发表于 2015-4-20 20:02:49 |只看作者 |坛友微信交流群
learsaas 发表于 2015-4-20 17:18
proc iml;
        A=(1:99)`||(1:99)`;
  B=J(A[,1],A[,2],0);
谢谢。谢谢。太感谢了。

使用道具

9
gavin4403 发表于 2015-4-20 21:00:17 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-4-20 09:54
hope this will help you
你好。如果Y中有重复的值,应该怎样解决呢?谢谢。

使用道具

10
gavin4403 发表于 2015-4-20 21:06:58 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-4-20 09:54
hope this will help you
你好,如果Y中的数存在很多重复值时怎样解决呢?比如Y中存在多个3、多个8、多个9······等等。谢谢。

使用道具

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

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

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

GMT+8, 2024-4-26 16:36