SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

求助,数据合并

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2010-12-16 21:19:33 | 只看该作者

Re: 求助,数据合并

谢谢各位了,这里高手太多了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2010-12-16 22:35:08 | 只看该作者

Re: 求助,数据合并

[code:2hzclyw0]data a;
input x : $20. y;
cards;
aaa 1
bbb 2
aaa,bbb,ccc 3
ddd 4
ddd,eee 5
ccc,eee 6
;[/code:2hzclyw0]
原始数据会出现这种情况吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2010-12-17 05:01:28 | 只看该作者

Re: 求助,数据合并

[code:3kleg128]data have;
        keep x s1; rename s1 =y;
        set a;
        do point =1 to nobs;
                set a (rename =(x =bx y =by)) point =point nobs =nobs;
                f1=find(bx, x, 't'); f2 =find(x, bx, 't');
                s1 =sum(s1, by*(f2>0));
                s2 =sum(s2, (f1>0));
        end;
        if s2 =1 then output;
run;[/code:3kleg128]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2010-12-17 10:36:06 | 只看该作者

Re: 求助,数据合并

楼上的是纵向遍历,如果数据量大的话,效率比较高。原理就是找只出现过一次的记录。
另外问下楼主:如果你数据是这样的话,可能就存在问题了,最长的那条记录出现两条哦,就输出不出来了。需要再做修改。
aaa 1
bbb 2
aaa,bbb,ccc 3
fff,aaa,bbb,ccc 4
fff,aaa,bbb,ccc 4
ddd 4
ddd,eee 5
fff 6
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2010-12-19 00:51:41 | 只看该作者

Re: 求助,数据合并

很对。我编程没有基础,思虑也欠周详。歉意。我的宗旨是:如果不是好的解答,那就作个反面的教材吧。无论是什么,我倒不介意。
另外,遍历是效率高还是不高的体现?我原以为遍历不可取呢。
京剧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
16#
 楼主| 发表于 2010-12-19 11:06:30 | 只看该作者

Re: 求助,数据合并

哈哈,如果能有适时停止的语句可以提高点效率。
比如,如果该记录在后面遍历的时候遇到第一条包含自己且不等于自己的就停止。
类似的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
17#
 楼主| 发表于 2010-12-19 15:12:49 | 只看该作者

Re: 求助,数据合并

鄙人觉得这种操作比较SASsy
[code:reu9h6oj]
data a;
input x :$20.  val;
cards;
aaa 1
bbb 2
aaa,bbb,ccc 3
fff,aaa,bbb,ccc 4
fff,aaa,bbb,ccc 4
ddd 4
ddd,eee 5
fff 6
;
run;

data master  sat(index=(x1)  rename=(x=x1  val=val1));
        set a;
        if find(x, ',')>0 then output master;
        else output sat;
run;


data master;
        modify master;
        i=1;
        x1=scan(x, i, ',');
        do while (x1^='');             
           do  until (_iorc_=%sysrc(_dsenom));
                set  sat  key=x1;
                select (_iorc_);
                     when(%sysrc(_sok))   val=val+val1;
                     when(%sysrc(_dsenom))  _error_=0;
                     otherwise  put "ERROR: I/O MALFUNCTION";
                end;
           end;
           i=i+1;
           x1=scan(x, i, ',');
      end;
run;
[/code:reu9h6oj]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 14:50 , Processed in 0.067924 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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