楼主: hamsik11
4249 26

[有偿编程] 悬赏求代码 [推广有奖]

11
hamsik11 发表于 2013-8-7 19:15:06 |只看作者 |坛友微信交流群
ziyenano 发表于 2013-8-7 18:45
data have;
input name1 $ name2 $;
datalines;
这个很大神,最后proc iml有点小问题出不来结果 能再看看改一下吗?谢谢拉

使用道具

12
ziyenano 发表于 2013-8-7 20:43:11 |只看作者 |坛友微信交流群
hamsik11 发表于 2013-8-7 19:14
这个很大神,最后proc iml有点小问题出不来结果 能再看看改一下吗?谢谢拉
最后加一句:
create want from res[colname=name rowname=name];
append from res[rowname=name];


使用道具

13
hamsik11 发表于 2013-8-7 21:58:06 |只看作者 |坛友微信交流群
ziyenano 发表于 2013-8-7 20:43
最后加一句:
create want from res[colname=name rowname=name];
append from res[rowname=name];
高手 谢谢,不过还有问题啊,譬如“Andy”列,按照数据,Andy只跟kim,tom,paull三个直接联结,加上对角线,应该只有4个1,可是生成的“Andy”列却有7个1.......

使用道具

14
ziyenano 发表于 2013-8-7 22:10:42 |只看作者 |坛友微信交流群
hamsik11 发表于 2013-8-7 21:58
高手 谢谢,不过还有问题啊,譬如“Andy”列,按照数据,Andy只跟kim,tom,paull三个直接联结,加上对角 ...
下标表示的有点问题,这样应该就没问题了:
proc iml;
use name_id;
read all var {name} into name;
close name_id;
use name_id2;
read all var{id1,id2} into id;
close name_id2;
res=j(nrow(name),nrow(name),0);
do i=1 to nrow(name);
res[id[i,1],id[i,2]]=1;
end;
create want from res[rowname=name colname=name];
append from res[rowname=name];
quit;

使用道具

15
jingju11 发表于 2013-8-7 23:34:18 |只看作者 |坛友微信交流群
如果没有IML, 数组也有类似的功能.值得注意的是数组和矩阵只是形似..京剧
  1. data have2;
  2.         set have(drop=name2)
  3.                         have(keep=name2 rename=(name2 =name1)) end=Eof;
  4.         if Eof then call symputx('nL', _n_);
  5. proc sort nodupkey; by name1;
  6.         run;

  7. data have3;
  8.         set have2 end=Eof;
  9.         array cha1r[&nL.] $32. _temporary_;
  10.         array cha2r[&nL.] $32. _temporary_;
  11.         retain fmtname 'name1inf' type 'I';
  12.         start =name1; end =start; label =_n_;
  13.         cha1r[_n_] =quote(cats(name1));
  14.         cha2r[_n_] =cats(name1);
  15.         if Eof then do;
  16.                 call symputx('nobs', _n_);
  17.                 call symputx('list', catx(' ', of cha1r[*]));
  18.                 call symputx('nams', catx(' ', of cha2r[*]));
  19.                 end;
  20.         run;
  21. proc format cntlin=have3; run;

  22. data Final;
  23.         length name $32; keep name &nams.;
  24.         set have end=Eof;
  25.         array mat[&nobs, &nobs] _temporary_(%eval(&nobs**2)*0) ;
  26.         array nam[&nobs] $ _temporary_ (&list.);        
  27.         array col[&nobs] &nams.;*Assuming all valid variable nams;
  28.         mat[input(name1, name1inf.),input(name2, name1inf.)] =1;
  29.         mat[input(name2, name1inf.),input(name1, name1inf.)] =1;
  30.         if Eof then do i =1 to dim1(mat);
  31.                 name =nam[i];
  32.                 do j =1 to dim2(mat);
  33.                         col[j] =mat[i,j];
  34.                         if i =j then col[j] =1;*on Diagonal;
  35.                         end;
  36.                 output;        
  37.                 end;        
  38.         run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
hamsik11 + 1 + 1 + 1 厉害

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

16
yongyitian 发表于 2013-8-8 08:05:05 |只看作者 |坛友微信交流群
  1. data havelong;
  2.     set have(rename=(name1=name0))
  3.         have(rename=(name2=name0 name1=name2));
  4.     Temp=1;
  5. run;
  6. proc sort data=havelong (rename=(name0=name1)) out=have_sort nodup;
  7.    by name1 name2;
  8. run;
  9. proc transpose data=have_sort out=have_trans (drop=_name_);
  10.    by name1;
  11.    id name2;
  12.    var temp;
  13. run;
  14. proc sql noprint;
  15.      select distinct name1 into : NameList separated by ' '
  16.      from have_sort order by name1;
  17. quit;  
  18. data want;
  19.    length name1 $8.;
  20.    array a{*} &NameList;
  21.     set have_trans;
  22.        do i = 1 to dim(a);
  23.           if name1 = vname(a[i]) then a[i]=1;
  24.           if missing(a[i]) then a[i]=0;
  25.        end;
  26.   drop i;
  27. run;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
hamsik11 + 1 + 1 + 1 精彩帖子
jingju11 + 5 + 5 + 5 真是望尘莫及!

总评分: 学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

使用道具

17
hamsik11 发表于 2013-8-8 10:42:32 |只看作者 |坛友微信交流群
ziyenano 发表于 2013-8-7 22:10
下标表示的有点问题,这样应该就没问题了:
proc iml;
use name_id;
比较悲剧的是 我处理一些大一点的数据,譬如10万个用户是,在res=j(nrow(name),nrow(name),0);这一步出现错误提示
ERROR: (execution) Unable to allocate sufficient memory. At least 2147483647 more bytes required.

请问 这个有办法解决吗?

使用道具

18
hamsik11 发表于 2013-8-8 10:48:31 |只看作者 |坛友微信交流群
jingju11 发表于 2013-8-7 23:34
如果没有IML, 数组也有类似的功能.值得注意的是数组和矩阵只是形似..京剧
多谢多谢 只是这个也存在一个问题,在处理大量用户数据的时候,在catx函数那一步出现,字符截断的问题,在 array mat[&nobs, &nobs] _temporary_(%eval(&nobs**2)*0) ;也出现内存不足的问题,我已经把设置MAXMEMQUERY=MAX了.....

请问jingju老师 这个有办法解决吗?

使用道具

19
hamsik11 发表于 2013-8-8 10:49:15 |只看作者 |坛友微信交流群
jingju11 发表于 2013-8-7 23:34
如果没有IML, 数组也有类似的功能.值得注意的是数组和矩阵只是形似..京剧
多谢多谢 只是这个也存在一个问题,在处理大量用户数据的时候,在catx函数那一步出现,字符截断的问题,在 array mat[&nobs, &nobs] _temporary_(%eval(&nobs**2)*0) ;也出现内存不足的问题,我已经把设置MAXMEMQUERY=MAX了.....

请问jingju老师 这个有办法解决吗?

使用道具

20
南方de梦 发表于 2013-8-8 10:51:50 |只看作者 |坛友微信交流群
data have ;
        input name1 :$8. name2 :$8. ;
        dummy = 1 ;
datalines;
Tom Jack
Jack Mike
Tom Hellen
Dora Hellen
Ross Jack
Will Paul
Paul Howard
Paul Andy
Andy Kim
Andy Tom
;
;;;;

/* create list of unique names that are in either column */
/* assumes names in name1 and name2 may be different lists */
proc sql ;
        create table unique_names as
        select distinct name
        from
        ( select distinct name1 as name
        from have )
        union (select distinct name2 as name
        from have )
        order by name
;
quit;

/* merge with original data to create complete list */
proc sort data=have ;
        by name1 name2;
        run;

data have2 ;
        merge have (in=a) unique_names (in=b rename=(name=name1));
        by name1; /* left side */
        if a or b;
run;

proc sort data=have2 ;
        by name2 name1;

data havenew ;
        merge have2 (in=a) unique_names (in=b rename=(name=name2));
        by name2; /*right side */
        if a or b;
run;

/* resort */
proc sort data=havenew;
        by name1 name2 ;
run;

/* read column names into macro var in sorted order */
/* used to sort column output from proc transpose */
proc sql noprint;
        select name into :namelist separated by ' '
        from unique_names
        order by name
;
quit;

/* get number of names - used for array processing later on */
proc sql noprint;
        select count ( distinct name ) into :namecnt
        from unique_names
;
quit;

/* transpose rows to columns */
proc transpose data=havenew out=want ;
        id name2;
        by name1 ;
run;

/* reorder proc transpose output */
/* assign 1 when name1 var matches column name */

data want;
attrib name1 &namelist label='';
set want (drop=_name_);
where name1 ne ' ' ;
run;


data havesorted (drop=i);
        set want;
        /* array nm {&namecnt} &namelist ;*/
        array nm
&namelist;
        do i = 1 to &namecnt ;
                /* deal with missing values (set to 1 or 0 ) */
                if nm{i} = . then do;
                        /* set to 1 if the person's name is the same as the column name */
                        if vname(nm)=name1 then nm{i}=1;
                        else nm{i} = 0;
                end;
        end;
run;


proc iml;
use havesorted;
read all var _NUM_ into m;
n_row=nrow(m);
n_col=ncol(m);
do i=1 to n_col;
   do j=1 to n_row;
      if m[j,i]=1 then m[i,j]=1;
   end;
end;
print m;
create MyData from m;
append from m;
close MyData;
quit;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
hamsik11 + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

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

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

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

GMT+8, 2024-4-28 03:04