楼主: hamsik11
4251 26

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

  • 0关注
  • 3粉丝

副教授

16%

还不是VIP/贵宾

-

威望
0
论坛币
9016 个
通用积分
1.0000
学术水平
5 点
热心指数
8 点
信用等级
4 点
经验
24082 点
帖子
405
精华
0
在线时间
569 小时
注册时间
2011-3-22
最后登录
2020-9-2

200论坛币
如下面数据所示,原始数据格式内容如下所示,每一列为一人名,每一行数据表示两个人之间建立联系,
TomJack
JackMike
TomHellen
DoraHellen
RossJack
WillPaul
PaulHoward
PaulAndy
AndyKim
AndyTom


要求把数据转成一个矩阵,上面变量名为人名,第一列也为人名,如果两个人之间建立直接联系,则标识为1,没有则为0,最终数字矩阵为一对称矩阵。因不懂IML,往高手帮忙,谢谢。
namesAndyDoraHellenHowardJackKimMikePaulRossTomWill
Andy

1

0

0

0

0

1

0

1

0

1

0

Dora

0

1

0

0

0

0

0

0

0

0

0

Hellen

0

0

1

0

0

0

0

0

0

1

0

Howard

0

0

0

1

0

0

0

1

0

0

0

Jack

0

0

0

0

1

0

1

0

1

1

0

Kim

1

0

0

0

0

1

0

0

0

0

0

Mike

0

0

0

0

1

0

1

0

0

0

0

Paul

1

0

0

1

0

0

0

1

0

0

0

Ross

0

0

0

0

1

0

0

0

1

0

0

Tom

1

0

1

0

1

0

0

0

0

1

0

Will

0

0

0

0

0

0

0

0

0

0

1



最佳答案

ziyenano 查看完整内容

data have; input name1 $ name2 $; datalines; Tom Jack Jack Mike Tom Hellen Dora Hellen Ross Jack Will Paul Paul Howard Paul Andy Andy Kim Andy Tom ; run; proc sql; create table name_id as select name,monotonic() as id from (select name1 as name from have union select name2 as name from have); create tabl ...
关键词:Howard Ellen Sandy Mandy Names

本帖被以下文库推荐

沙发
ziyenano 发表于 2013-8-7 13:06:11 |只看作者 |坛友微信交流群
data have;
input name1 $ name2 $;
datalines;
Tom        Jack
Jack        Mike
Tom        Hellen
Dora        Hellen
Ross        Jack
Will        Paul
Paul        Howard
Paul        Andy
Andy        Kim
Andy        Tom
;
run;

proc sql;
create table name_id as
select name,monotonic() as id from
(select name1 as name from have
union
select name2 as name from have);

create table name_id1 as
select t.*,t1.id as id1
from
have t
inner join
name_id t1
on t.name1=t1.name;

create table name_id2 as
select t.*,t1.id as id2
from
name_id1 t
inner join
name_id t1
on t.name2=t1.name;
quit;

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);
res[id[,1],id[,2]]=1;
create want from res[colnames=name rownames=name];
quit;

使用道具

藤椅
playmore 发表于 2013-8-7 14:46:06 |只看作者 |坛友微信交流群
data have;
input name1 $ name2 $;
datalines;
Tom        Jack
Jack        Mike
Tom        Hellen
Dora        Hellen
Ross        Jack
Will        Paul
Paul        Howard
Paul        Andy
Andy        Kim
Andy        Tom
;
run;

data have;
set have;
id=1;
run;

proc sort data=have;
by name1;
run;

proc transpose data=have out=want;
by name1;
id name2;
var id;
run;

data want(drop=i);
set want;
array numvar _NUMERIC_;
do i=1 to dim(numvar);
        if numvar(i)=. then numvar(i)=0;
end;
run;
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
hamsik11 + 1 + 1 + 1 厉害
Imasasor + 80 + 100 + 4 + 1 + 1 热心帮助其他会员
beijingdizheng + 1 + 1 + 1 高手

总评分: 经验 + 80  论坛币 + 100  学术水平 + 6  热心指数 + 3  信用等级 + 3   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

板凳
akakak123 发表于 2013-8-7 15:50:01 |只看作者 |坛友微信交流群
data a;                                                                                                                                 
input name $ @@;                                                                                                                        
cards;                                                                                                                                 
Andy Dora Hellen Howard Jack Kim Mike Paul Ross Tom Will                                                                                
;                                                                                                                                       
run;                                                                                                                                    
data b;                                                                                                                                 
set a;                                                                                                                                 
length Andy $1 Dora $1 Hellen $1 Howard $1 Jack $1 Kim $1 Mike $1 Paul $1 Ross $1 Tom $1 Will $1 ;                                      
run;                                                                                                                                    
                                                                                                                                       
                                                                                                                                       
data c;                                                                                                                                 
set b;                                                                                                                                 
if name='Tom' then Jack=1;                                                                                                              
else Jack=0;                                                                                                                           
if name='Jack' then Mike=1;                                                                                                            
else Mike=0;                                                                                                                           
if name='Tom' then Hellen=1;                                                                                                            
else Hellen=0;                                                                                                                          
if name='Dora' then Hellen=1;                                                                                                           
if name='Ross' then Jack=1;                                                                                                            
if name='Will' then  Paul=1;                                                                                                            
else Paul=0;                                                                                                                           
if name='Paul' then Howard=1;                                                                                                           
else Howard=0;                                                                                                                          
if name='Paul' then Andy=1;                                                                                                            
else Andy=0;                                                                                                                           
if name='Andy' then Kim=1;                                                                                                              
else Kim=0;                                                                                                                             
if name='Andy' then Tom=1;                                                                                                              
else Tom=0;                                                                                                                             
if name='Tom' then Jack=1;                                                                                                              
if name='Mike' then Jack=1;                                                                                                            
if name='Hellen' then Tom=1;                                                                                                            
if name='Hellen' then Dora=1;                                                                                                           
else Dora=0;                                                                                                                           
if name='Jack' then Ross=1;                                                                                                            
else Ross=0;                                                                                                                           
if name='Paul' then  Will=1;                                                                                                            
else Will=0;                                                                                                                           
if name='Howard' then Paul=1;                                                                                                           
if name='Andy' then Paul=1;                                                                                                            
if name='Kim' then Andy=1;                                                                                                              
if name='Tom' then Andy=1;                                                                                                              
if name='Andy' then andy=1;                                                                                                            
if name='Dora' then Dora=1;                                                                                                            
if name='Hellen' then hellen=1;                                                                                                         
if name='Howard' then howard=1;                                                                                                         
if name='Jack' then jack=1;                                                                                                            
if name='Kim' then kim=1;                                                                                                               
if name='Mike' then Mike=1;                                                                                                            
if name='Paul' then paul=1;                                                                                                            
if name='Ross' then ross=1;                                                                                                            
if name='Tom' then tom=1;                                                                                                               
if name='Will' then will=1;                                                                                                            
run;

使用道具

报纸
hamsik11 发表于 2013-8-7 16:48:04 |只看作者 |坛友微信交流群
playmore 发表于 2013-8-7 14:46
data have;
input name1 $ name2 $;
datalines;
这个不行 你看Tom和andy在有关联,那tom-andy,andy-tom对应的都应该是1

使用道具

地板
hamsik11 发表于 2013-8-7 16:48:33 |只看作者 |坛友微信交流群
playmore 发表于 2013-8-7 14:46
data have;
input name1 $ name2 $;
datalines;
这个不行 你看Tom和andy在有关联,那tom-andy,andy-tom对应的都应该是1

使用道具

7
hamsik11 发表于 2013-8-7 16:49:23 |只看作者 |坛友微信交流群
akakak123 发表于 2013-8-7 15:50
data a;                                                                                              ...
这样不行,没扩展性,倒腾半天,不如我在excel里面填数字 再导入sas算了

使用道具

8
playmore 发表于 2013-8-7 17:08:15 |只看作者 |坛友微信交流群
hamsik11 发表于 2013-8-7 16:48
这个不行 你看Tom和andy在有关联,那tom-andy,andy-tom对应的都应该是1
嗯,刚看了下
我的方法适合单向的关联
你要是做多项的话
把我得到的结果,用IML对矩阵沿对角线做个镜像吧,一边为1则别一边也为1就好
否则改下初始表格也行,如下所示:

data have(drop=name0);
set have;
output;
name0=name1;
name1=name2;
name2=name0;
output;
run;
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

9
hamsik11 发表于 2013-8-7 17:29:23 |只看作者 |坛友微信交流群
playmore 发表于 2013-8-7 17:08
嗯,刚看了下
我的方法适合单向的关联
你要是做多项的话
捣腾出来了,以前没用过Proc IML,....

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;
  • 使用道具

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

    使用道具

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

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

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

    GMT+8, 2024-4-28 12:23