楼主: liu022
3719 14

[原创博文] 删除重复记录 [推广有奖]

  • 0关注
  • 6粉丝

已卖:181份资源

讲师

64%

还不是VIP/贵宾

-

威望
0
论坛币
879 个
通用积分
7.4013
学术水平
23 点
热心指数
18 点
信用等级
21 点
经验
3667 点
帖子
430
精华
1
在线时间
375 小时
注册时间
2007-5-21
最后登录
2026-1-16

楼主
liu022 发表于 2012-9-12 09:04:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
大家好!
      我刚刚碰到删除重复记录的问题,想向大家请教。
      有一个数据集A:
      stkcd1   stkcd2  corr
         1           2        0.99
         2           4        0.98
         1           4        0.97
         3           4        0.91

       我希望按照Corr求出股票的对数,并且删除重复的,最后得到的结果如下:
         stkcd1   stkcd2  corr
         1           2        0.99
         3           4        0.91

        就是删掉了第二行和第三行,因为这两行包含了前面出现的股票1和股票2.

        请问有没有什么办法实现?

        谢谢老师!
二维码

扫码加我 拉你入群

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

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

关键词:stkcd 请问有没有 Corr STK cor 记录

回帖推荐

pobel 发表于5楼  查看完整内容

data test; input stkcd1 $ stkcd2 $ corr; cards; 1 2 0.99 2 4 0.98 1 4 0.97 3 4 0.91 4 2 0.92 7 8 0.97 3 7 0.99 5 6 0.89 a b 0.99 B c 0.88 c d 0.95 ; data wanted; set test; length stk_list $100; retain stk_list " "; if find(stk_list,stkcd1,"ti") or find(stk_list,stkcd2,"ti") then delete; stk_list=catx(" ",stk_list,stkcd1,stkcd2); drop stk_list; run;

本帖被以下文库推荐

沙发
playmore 发表于 2012-9-12 09:14:50
proc sql里select加distinct修饰符就行
但是你的需求挺怪的,呵呵
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
liu022 发表于 2012-9-12 09:26:49
playmore 发表于 2012-9-12 09:14
proc sql里select加distinct修饰符就行
但是你的需求挺怪的,呵呵
请问老师能够具体一点吗?我是在写配对交易的程序。首先求出了每两只股票之间的相关系数,然后根据相关系数选择。但是股票对不能够重复~

板凳
liu022 发表于 2012-9-12 09:28:59
playmore 发表于 2012-9-12 09:14
proc sql里select加distinct修饰符就行
但是你的需求挺怪的,呵呵
proc sql;
create table pairs as
select distinct * from a;
quit;

这就话达不到我希望的结果

报纸
pobel 在职认证  发表于 2012-9-12 09:41:52
data test;
input stkcd1 $   stkcd2 $  corr;
cards;
1 2 0.99
2 4 0.98
1 4 0.97
3 4 0.91
4 2 0.92
7 8 0.97
3 7 0.99
5 6 0.89
a b 0.99
B c 0.88
c d 0.95
;

data wanted;
    set test;
        length stk_list $100;
        retain stk_list " ";
        if find(stk_list,stkcd1,"ti") or find(stk_list,stkcd2,"ti") then delete;
        stk_list=catx(" ",stk_list,stkcd1,stkcd2);
        drop stk_list;
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

和谐拯救危机

地板
liu022 发表于 2012-9-12 09:50:59
pobel 发表于 2012-9-12 09:41
data test;
input stkcd1 $   stkcd2 $  corr;
cards;
谢谢老师!您这种做法是将股票代码转化为字符,然后用catx函数来连接的。

那么,进一步请问,股票代码不是字符,如果是数字,有没有类似数组的东西来解决这个问题呢?

谢谢!

7
playmore 发表于 2012-9-12 10:04:34
pobel 发表于 2012-9-12 09:41
data test;
input stkcd1 $   stkcd2 $  corr;
cards;
嗯,是个好办法
后来我也想到了
只不这个stk_list可能要很长了
如果股票数目众多可能不是最佳的选择
1000支股票×6+999空格,得有7000个字符了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

8
pobel 在职认证  发表于 2012-9-12 10:13:48
data test;
input stkcd1 stkcd2   corr;
cards;
1 2 0.99
2 4 0.98
1 4 0.97
3 4 0.91
4 2 0.92
7 8 0.97
3 7 0.99
5 6 0.89
11 12 0.99
13 14 0.88
12 14 0.95
;

data wanted;
    length stock 8;
    if _n_=1 then do;
            declare hash h();
                    h.definekey('stock');
                        h.definedata('stock');
                        h.definedone();
        end;
    set test;
        stock=stkcd1; find1=h.find();
    stock=stkcd2; find2=h.find();
    if find1=0 or find2=0 then delete;
        stock=stkcd1; h.add();
    stock=stkcd2; h.add();
        drop find1 find2 stock;
run;
和谐拯救危机

9
liu022 发表于 2012-9-12 10:22:38
pobel 发表于 2012-9-12 09:41
data test;
input stkcd1 $   stkcd2 $  corr;
cards;
谢谢老师!

运行您的程序是证券的,但是我自己的数据集计算出来不对。还是有很多都没有删除。我将日志附了上来。并且是在下面程序中进行的。麻烦老师帮忙看看错在什么地方?

谢谢!

data pairs;
set pairs.ppp_1995_1;
if stkcd1<stkcd2;
format s1 $6. s2 $6.;
s1=compress(stkcd1);
s2=compress(stkcd2);
run;

proc sort data=pairs;by year month sse;run;

data wanted;
set pairs;
length stk_list $100;
retain stk_list " ";
if find(stk_list,s1,"ti") or find(stk_list,s2,"ti") then delete;
stk_list=catx(" ",stk_list,s1,s2);
drop stk_list s1 s2;
run;

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

日志

344  data pairs;
345  set pairs.ppp_1995_1;
346  if stkcd1<stkcd2;
347  format s1 $6. s2 $6.;
348  s1=compress(stkcd1);
349  s2=compress(stkcd2);
350  run;

NOTE: 数值已转换为字符值,位置:(行:列)。
      348:13   349:13
NOTE: 有 82082 个从数据集 PAIRS.PPP_1995_1 读取的观测。
NOTE: 数据集 WORK.PAIRS 有 41041 个观测和 7 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.07 秒
      CPU 时间          0.07 秒


351
352  proc sort data=pairs;by year month sse;run;

NOTE: 有 41041 个从数据集 WORK.PAIRS 读取的观测。
NOTE: 数据集 WORK.PAIRS 有 41041 个观测和 7 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          0.07 秒
      CPU 时间          0.03 秒


353
354  data wanted;
355  set pairs;
356  length stk_list $100;
357  retain stk_list " ";
358  if find(stk_list,s1,"ti") or find(stk_list,s2,"ti") then delete;
359  stk_list=catx(" ",stk_list,s1,s2);
360  drop stk_list s1 s2;
361  run;

NOTE: 有 41041 个从数据集 WORK.PAIRS 读取的观测。
NOTE: 数据集 WORK.WANTED 有 32906 个观测和 5 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.06 秒
      CPU 时间          0.06 秒


362
363  /*For Check*/
364  data check;
365  set wanted(keep=stkcd1 rename=(stkcd1=stkcd))
366      wanted(keep=stkcd2 rename=(stkcd2=stkcd));
367  run;

NOTE: 有 32906 个从数据集 WORK.WANTED 读取的观测。
NOTE: 有 32906 个从数据集 WORK.WANTED 读取的观测。
NOTE: 数据集 WORK.CHECK 有 65812 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


368
369  proc sort data=check nodup;by stkcd;run;

NOTE: 有 65812 个从数据集 WORK.CHECK 读取的观测。
NOTE: 65536 个重复观测已删除。
NOTE: 数据集 WORK.CHECK 有 276 个观测和 1 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          0.07 秒
      CPU 时间          0.14 秒



最后的Check数据集中仍然存在重复的记录,被删除了65536条记录

10
liu022 发表于 2012-9-12 10:26:44
pobel 发表于 2012-9-12 09:41
data test;
input stkcd1 $   stkcd2 $  corr;
cards;
我猜想上述问题的原因是采用字符型的stk_list来存储数据的。这就导致了stk_list长度不够,不能保存足够多的字符。所以删除不干净。

请问老师如果是数组来存储,应该怎么进行?

谢谢!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 14:00