楼主: 楊中
3139 13

[问答] merge合并的问题(130401更新问题) [推广有奖]

  • 0关注
  • 0粉丝

大专生

40%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
564 点
帖子
40
精华
0
在线时间
30 小时
注册时间
2012-10-1
最后登录
2022-5-2

楼主
楊中 发表于 2013-4-1 01:03:36 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

小弟现在遭遇的问题是,
s0b11,小弟单纯的合并,没有by 任何变量。
但是我希望的是结果出来,公司(acno)12可以水平对齐。
请参考附件EXCEL文件,对不到的地方是missing(.)


但是,若小弟用s0b1,合并后,有by 变量。
会发现公司(acno)12可以水平对齐,
不过却多补上了2笔资料(àB1里面的第5笔和第6笔的数据)

不知道有没有高手,可以帮小弟解决这问题。


PS希望不要告诉小弟说先按照商品(KEY)把数据先output之后再merge
    小弟原始檔中,商品有好几种,公司有好几家。如果先细分,再分别merge  

   我知道怎用,但是会花需多时间去整理。我希望能在同一个SAS檔里,就

   直接跑出想要的结果,有劳前辈们给予指教



附上程序语法

data s0b1;      

merge s0 b1 (rename = (date = date1  bs = bs1 os =  os1 deal=deal1 price = price1                               deal_qty = deal_qty1)) ;        

by acno key settmon;

run;


data s0b11;      

merge s0 b1 (rename = (date = date1 acno = acno1   key = key1
settmon=settmon1  bs = bs1  os = os1  deal=deal1  rice = price1 deal_qty = deal_qty1)) ;

run;




附件是小弟的数据例子(TXT文件)

b1.txt (557 Bytes)

s0.txt (631 Bytes)

outcome.xls (26 KB)



以下是20130401小弟利用yongyitian大的程序代码后,
发现到另一种问题,所以修改一下例子,
重新上传附件,希望高手们之后根据以下附件档案来解题。
EXCEL檔是我想要的结果。

outcome.xls (26 KB)
b1.txt (557 Bytes)

s0.txt (631 Bytes)



二维码

扫码加我 拉你入群

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

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

关键词:Merge 新问题 missing rename output EXCEL 资料

沙发
heperwong 在职认证  发表于 2013-4-1 09:12:15
希望不要放在附件里,有些人会没钱下载的。

藤椅
楊中 发表于 2013-4-1 11:37:54
heperwong 发表于 2013-4-1 09:12
希望不要放在附件里,有些人会没钱下载的。
是哦,我没注意到这问题 = =”
不过我印象中,通常论坛里面下载附件,
应该不会损失甚么吧???
我也没设置甚么条件…….
基本上应该大家都能下载参考,不会有很大影响吧????

板凳
yongyitian 发表于 2013-4-1 12:04:10
感觉你的数据中有很多重复的观测值。如果这些重复的观测值都是有用的,那么缺少一个定义每一个观测值变量。 如果你想保留重复的观测值,并得到excel file中的结果。试试下面的code。

data b1;
input acno key $ settmon $ date $  deal bs $ os price deal_qty;
datalines;
1 a 200004 20000327 1132 B 1 9853 2
1 a 200004 20000327 1132 B 1 9853 2
1 a 200004 20000327 1132 B 1 9852 2
1 a 200004 20000327 1132 B 1 9852 2
2 b 200006 20000529 1055 B 1 467 1
2 b 200006 20000529 1055 B 1 467 1
2 b 200006 20000529 1055 B 1 467 1
2 b 200006 20000529 1055 B 1 467 3
2 b 200006 20000529 1055 B 1 467 3
2 b 200006 20000529 1055 B 1 467 3
2 b 200006 20000529 1055 B 1 467 2
2 b 200006 20000529 1055 B 1 467 2
2 b 200006 20000529 1055 B 1 467 2
2 b 200006 20000529 1055 B 1 467 2
2 b 200006 20000529 1055 B 1 467 2
;
data S0;
input acno date $ key $ settmon $ deal bs $ os price deal_qty;
datalines;
1 20000317 a 200004 1129 S 0 8680 5
1 20000317 a 200004 1129 S 0 8680 5
1 20000317 a 200004 1129 S 0 8680 5
1 20000317 a 200004 1129 S 0 8680 1
1 20000317 a 200004 1129 S 0 8680 1
1 20000317 a 200004 1129 S 0 8680 1
2 20000524 b 200006 906 S 0 462 5
2 20000524 b 200006 906 S 0 462 5
2 20000524 b 200006 906 S 0 462 5
2 20000524 b 200006 906 S 0 462 5
2 20000524 b 200006 906 S 0 462 5
2 20000524 b 200006 912 S 0 459.2 5
2 20000524 b 200006 912 S 0 459.2 5
2 20000524 b 200006 912 S 0 459.2 5
2 20000524 b 200006 912 S 0 459.2 5
2 20000524 b 200006 912 S 0 459.2 5
;
/* my code */
proc sort data=s0 out=s0_sort;    /* sort s0 by acno */
   by acno;
run;
proc sort data=b1 out =b1_sort;   /* sort b1 by acno */
   by acno;
run;
data s0_id;         /* add an ID for each acno group */
     set s0_sort;
  by acno;
  if first.acno then id=1;
     else id+1;
run;
data b1_id;                          /* add an ID for each acno group */
     set b1_sort;
  by acno;
  if first.acno then id=1;
     else id+1;
run;
data s0b1_merge(drop=id);            /* merge the s0_id and b1_id */
merge s0_id b1_id (rename = (date = date1    bs = bs1          os = os1
                             deal = deal1 price = price1 deal_qty = deal_qty1)) ;        
by acno key settmon id;
run;
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 100 + 100 + 2 + 2 + 2 精彩帖子
楊中 + 1 + 1 + 1 观点有启发

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

报纸
楊中 发表于 2013-4-1 16:47:46
yongyitian 发表于 2013-4-1 12:04
感觉你的数据中有很多重复的观测值。如果这些重复的观测值都是有用的,那么缺少一个定义每一个观测值变量。 ...
Y大,您说到一个重点了,
我的确是缺少一个关键变量来合并,
只是怎么产生这一个”关键变量”,脑袋卡住了。
透过Y大您的程序代码,创造ID这个变量,
小技巧,却是很大的效益阿,谢谢您,我有方向了。

地板
楊中 发表于 2013-4-1 23:29:49
yongyitian 发表于 2013-4-1 12:04
感觉你的数据中有很多重复的观测值。如果这些重复的观测值都是有用的,那么缺少一个定义每一个观测值变量。 ...
Y大,一楼我重新修改了一下范例(附上新的档案),
然后根据你提供的想法,我重新修改一下,
发现合并后,有问题,跟我EXCEL想要的结果不同。
关键,好像是在settmon这一个变量有影响。
所以,最后多了几笔不要的数据(missing)。
不知道有没有解决之道………
PS:我资料相对应,主要依据acno(公司) key(商品) settmon(目标商品到期月份) 3个。
以下附上我的程序代码:
data s0_id;         /* add an ID for each acno group */
     set s0;
  by acno;
  if first.acno then id=1;
     else id+1;
run;
data b1_id;                          /* add an ID for each acno group */
     set b1;
  by acno;
  if first.acno then id=1;
     else id+1;
run;
data s0b1_merge;            /* merge the s0_id and b1_id */
merge s0_id b1_id (rename = (date = date1    bs = bs1          os = os1
                             deal = deal1 price = price1 deal_qty = deal_qty1 )) ;        
by acno key settmon id;
run;

data b0_id;         /* add an ID for each acno group */
     set b0;
  by acno;
  if first.acno then id=1;
     else id+1;
run;
data s1_id;                          /* add an ID for each acno group */
     set s1;
  by acno;
  if first.acno then id=1;
     else id+1;
run;
data b0s1_merge;            /* merge the s0_id and b1_id */
merge b0_id s1_id (rename = (date = date1    bs = bs1          os = os1
                             deal = deal1 price = price1 deal_qty = deal_qty1)) ;        
by acno key settmon id;
run;

7
yongyitian 发表于 2013-4-2 12:07:00
Your data have three levels: acno key,settmon。 the first two (acno and key) must be listed in the by statement in that order. So you cannot rename acno and key. Id was created on settmon, and used as by variable instead of settmon. So you can rename settmon in one of the dataset.

You need to SORT and SET the data by the three levels in order for the data to be correctly merged.

So the results are slightly different from that in the Excel file.

data S0;
input acno        date        $ key $ settmon        $ deal        bs        $ os        price        deal_qty;
datalines;
1        20000317        a        200004        1129        S        0        8680        5
1        20000317        a        200004        1129        S        0        8680        5
1        20000317        a        200004        1129        S        0        8680        5
1        20000317        a        200504        1131        S        0        8680        1
1        20000317        a        200504        1131        S        0        8680        1
1        20000317        a        200504        1131        S        0        8680        1
2        20000524        b        200006        906        S        0        462        5
2        20000524        b        200006        906        S        0        462        5
2        20000524        b        200006        906        S        0        462        5
2        20000524        b        200006        906        S        0        462        5
2        20000524        b        200006        906        S        0        462        5
2        20000524        b        200006        912        S        0        459.2        5
2        20000524        b        200006        912        S        0        459.2        5
2        20000524        b        200006        912        S        0        459.2        5
2        20000524        b        200006        912        S        0        459.2        5
2        20000524        b        200006        912        S        0        459.2        5
;

data b1;
input acno        key        $ settmon        $ date        $  deal        bs        $ os        price        deal_qty;
datalines;
1        a        200004        20000327        1132        B        1        9853        2
1        a        200004        20000327        1132        B        1        9853        2
1        a        200504        20000327        1137        B        1        9852        2
1        a        200504        20000327        1137        B        1        9852        2
2        b        200006        20000529        1055        B        1        467        1
2        b        200006        20000529        1055        B        1        467        1
2        b        200006        20000529        1055        B        1        467        1
2        b        200006        20000529        1055        B        1        467        3
2        b        200006        20000529        1055        B        1        467        3
2        b        200006        20000529        1055        B        1        467        3
2        b        200006        20000529        1055        B        1        467        2
2        b        200006        20000529        1055        B        1        467        2
2        b        200006        20000529        1055        B        1        467        2
2        b        200006        20000529        1055        B        1        467        2
;

proc sort data=s0 out=s0_sort;   /* sort s0 by acno key and settmon */
   by acno key settmon;
run;
proc sort data=b1 out =b1_sort;   /* sort b1 by acno key and settmon */
   by acno key settmon;
run;

data s0_id;         /* add an ID on the lowest level: settmon */
     set s0_sort;
         by acno key settmon;
         if first.settmon then id=1;
            else id+1;
run;
data b1_id;         /* add an ID on the lowest level: settmon */
     set b1_sort;
         by acno key settmon;
         if first.settmon then id=1;
            else id+1;
run;

proc sort data=s0_id;  /* sort the data by three levels */
   by acno key id;
run;
proc sort data=b1_id;  /* sort the data by three levels */
   by acno key id;
run;

data s0b1_merge (drop=id);    /* merge the s0_id and b1_id */
merge s0_id b1_id (rename = (date = date1    bs = bs1      os = os1 settmon=settmon1
                             deal = deal1 price = price1 deal_qty = deal_qty1)) ;        
by acno key id;
run;

proc sort data=s0b1_merge;  /* sort the results by three level */
      by acno key settmon;
run;

proc print data=s0b1_merge; title 's0b1_merge'; run;

8
楊中 发表于 2013-4-2 14:47:02
yongyitian 发表于 2013-4-2 12:07
Your data have three levels: acno key,settmon。 the first two (acno and key) must be listed in the  ...
Y大,这次的想法我知道,不过又卡住了一个问题,
假使每笔 settmon都一样,我把B1的数据重新修改如下:

data b1;
input acno        key        $ settmon        $ date        $  deal        bs        $ os        price        deal_qty;
datalines;
1        a        200006        20000327        1132        B        1        9853        2
1        a        200006        20000327        1132        B        1        9853        2
1        a        200006        20000327        1137        B        1        9852        2
1        a        200006        20000327        1137        B        1        9852        2
2        b        200006        20000529        1055        B        1        467        1
2        b        200006        20000529        1055        B        1        467        1
2        b        200006        20000529        1055        B        1        467        1
2        b        200006        20000529        1055        B        1        467        3
2        b        200006        20000529        1055        B        1        467        3
2        b        200006        20000529        1055        B        1        467        3
2        b        200006        20000529        1055        B        1        467        2
2        b        200006        20000529        1055        B        1        467        2
2        b        200006        20000529        1055        B        1        467        2
2        b        200006        20000529        1055        B        1        467        2
;

结果,就又会失败了 = =”

PS:总结来说,目前我总共发现3个问题(3种情况),
    第一个情况,Y大您提供了产生ID的想法。
    第二个情况,Y大您提供了利用ID排序的想法。
    第三个情况,发问中………….
    然后,目前我的原始资料文件中,好像同时存在第二和第三个情况,
    但是,好像程序代码无法同时适用第二和第三种情况……….

一次又一次卡关,不知道会不会牺牲Y大太多时间来帮忙…..
有的话,说声抱歉……

9
Imasasor 发表于 2013-4-2 23:57:02
yongyitian 发表于 2013-4-2 12:07
Your data have three levels: acno key,settmon。 the first two (acno and key) must be listed in the  ...
Y大真是热心,水平又高啊
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

10
蓝色 发表于 2013-4-3 01:31:47
stata合并数据更容易

clear
input ///
acno  str10 key    settmon    date     deal str10 bs    os    price    deal_qty
1    a    200004    20000327    1132    B    1    9853    2
1    a    200004    20000327    1132    B    1    9853    2
1    a    200504    20000327    1137    B    1    9852    2
1    a    200504    20000327    1137    B    1    9852    2
2    b    200006    20000529    1055    B    1    467    1
2    b    200006    20000529    1055    B    1    467    1
2    b    200006    20000529    1055    B    1    467    1
2    b    200006    20000529    1055    B    1    467    3
2    b    200006    20000529    1055    B    1    467    3
2    b    200006    20000529    1055    B    1    467    3
2    b    200006    20000529    1055    B    1    467    2
2    b    200006    20000529    1055    B    1    467    2
2    b    200006    20000529    1055    B    1    467    2
2    b    200006    20000529    1055    B    1    467    2
end

rename * *1
gen acno   =acno1
gen settmon=settmon1
gen key    =key1
bysort acno key settmon: gen id=_n

save d:\b1.dta,replace

clear
input ///
acno        date     str10 key    settmon    deal str10 bs    os    price    deal_qty
1    20000317    a    200004    1129    S    0    8680    5
1    20000317    a    200004    1129    S    0    8680    5
1    20000317    a    200004    1129    S    0    8680    5
1    20000317    a    200504    1131    S    0    8680    1
1    20000317    a    200504    1131    S    0    8680    1
1    20000317    a    200504    1131    S    0    8680    1
2    20000524    b    200006    906    S    0    462    5
2    20000524    b    200006    906    S    0    462    5
2    20000524    b    200006    906    S    0    462    5
2    20000524    b    200006    906    S    0    462    5
2    20000524    b    200006    906    S    0    462    5
2    20000524    b    200006    912    S    0    459.2    5
2    20000524    b    200006    912    S    0    459.2    5
2    20000524    b    200006    912    S    0    459.2    5
2    20000524    b    200006    912    S    0    459.2    5
2    20000524    b    200006    912    S    0    459.2    5
end


bysort acno key settmon: gen id=_n
merge 1:1  acno key settmon id using d:\b1.dta

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

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