五月天婷亚洲天久久综合网,婷婷丁香五月激情亚洲综合,久久男人精品女人,麻豆91在线播放

  • <center id="8gusu"></center><rt id="8gusu"></rt>
    <menu id="8gusu"><small id="8gusu"></small></menu>
  • <dd id="8gusu"><s id="8gusu"></s></dd>
    樓主: 消散2
    1797 6

    [技術(shù)討論與投票] 有關(guān)雙set的問(wèn)題希望大佬解釋一下究竟如何運(yùn)作 [推廣有獎(jiǎng)]

    • 0關(guān)注
    • 0粉絲

    本科生

    33%

    還不是VIP/貴賓

    -

    威望
    0 級(jí)
    論壇幣
    503 個(gè)
    通用積分
    4.0000
    學(xué)術(shù)水平
    1 點(diǎn)
    熱心指數(shù)
    2 點(diǎn)
    信用等級(jí)
    1 點(diǎn)
    經(jīng)驗(yàn)
    104 點(diǎn)
    帖子
    12
    精華
    0
    在線時(shí)間
    160 小時(shí)
    注冊(cè)時(shí)間
    2016-3-25
    最后登錄
    2024-10-4

    50論壇幣
    我有兩個(gè)問(wèn)題轉(zhuǎn)不過(guò)來(lái),這是2017年pharmaSUG的一篇論文中的內(nèi)容。論文中主要分析雙set對(duì)比sql在merge方面,data步迭代數(shù)量更好,運(yùn)行更快。但是兩個(gè)set對(duì)我來(lái)說(shuō)不太好理解,論文中說(shuō)一共運(yùn)行了12+5=17次,也就是其實(shí)每個(gè)數(shù)據(jù)集每一條只讀了一次。
    Q1: do while那句,為什么是不在那個(gè)范圍內(nèi)set數(shù)據(jù)集? 好難轉(zhuǎn)過(guò)勁來(lái)
    Q2:雙SET時(shí)data步內(nèi)部究竟是怎么運(yùn)行的,是第一個(gè)數(shù)據(jù)集讀一條,然后進(jìn)入循環(huán),滿足了while條件后第二個(gè)數(shù)據(jù)集讀一條,然后再循環(huán)嗎?  那在進(jìn)行while判斷的時(shí)候難道不是5條都判斷一下嗎?  那不就是12*5次迭代了嗎?


    下面是程序
    /**sample dataset**/
    data bonus_criteria;
    input low high factor @@;
    cards;
    0 500 0.1
    501 1000 0.2
    1001 2000 0.4
    2001 5000 0.6
    5001 10000 0.8
    ;
    run;

    data sale_amount;
    input name $ salary amount @@;
    cards;
    Jim 500 200
    Tom 1000 700
    Lily 2000 1500
    Saly 700 300
    Gery 3500 3000
    Coliy 4500 6000
    Jony 5000 3000
    lary 2000 300
    Sam 1040 200
    Jamy 5600 1200
    Bob 3400 500
    Salla 2600 24
    ;
    run;

    /** Use SET/SET join two datasets to derive new variable **/
    proc sort data=bonus_criteria; by low high;run;
    proc sort data=sale_amount; by amount;run;
    data bonus;
    set sale_amount ;
    do while(not(low le amount le high));
    set bonus_criteria ;
    end;
    bonus=salary*factor;
    run;


    最佳答案

    hsubin 查看完整內(nèi)容

    Obs name salary amount low high factor bonus 1 Salla 2600 24 0 500 0.1 260 2 Jim 500 200 0 500 0.1 50 3 Sam 1040 200 0 500 0.1 104 4 Saly 700 300 ...
    關(guān)鍵詞:兩個(gè)問(wèn)題 數(shù)據(jù)集 判斷的 再循環(huán) sas技術(shù) 雙set merge 循環(huán)
    已有 1 人評(píng)分論壇幣 學(xué)術(shù)水平 熱心指數(shù) 信用等級(jí) 收起 理由
    hsubin + 5 + 1 + 1 + 1 學(xué)習(xí)啦

    總評(píng)分: 論壇幣 + 5  學(xué)術(shù)水平 + 1  熱心指數(shù) + 1  信用等級(jí) + 1   查看全部評(píng)分

    沙發(fā)
    hsubin 在職認(rèn)證  發(fā)表于 2018-8-9 20:42:28 |只看作者 |壇友微信交流群

                   Obs    name     salary    amount     low     high    factor    bonus

                       1    Salla     2600        24        0      500      0.1       260
                       2    Jim        500       200        0      500      0.1        50
                       3    Sam       1040       200        0      500      0.1       104
                       4    Saly       700       300        0      500      0.1        70
                       5    lary      2000       300        0      500      0.1       200
                       6    Bob       3400       500        0      500      0.1       340
                       7    Tom       1000       700      501     1000      0.2       200
                       8    Jamy      5600      1200     1001     2000      0.4      2240
                       9    Lily      2000      1500     1001     2000      0.4       800
                      10    Gery      3500      3000     2001     5000      0.6      2100
                      11    Jony      5000      3000     2001     5000      0.6      3000
                      12    Coliy     4500      6000     5001    10000      0.8      3600
    謝謝樓主的精彩講解。理解了雙指針,每一步指針的位置,以及PDV initialization 就能理解這個(gè)題了,再次證明理解PDV是多么重要!多謝,學(xué)習(xí)了
    藤椅
    消散2 發(fā)表于 2018-8-9 22:39:29 |只看作者 |壇友微信交流群
    嗯我搞明白了,供大家參考,歡迎指正,共同進(jìn)步

    結(jié)論:雙set不利于程序分享,并且如果存在排序問(wèn)題會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤。這個(gè)文獻(xiàn)中的例子取的很巧,用這種方法確實(shí)可以解決以單變量排序的此類merge問(wèn)題,倘若排序時(shí)by變量有兩個(gè),amount不是完全升序排列,會(huì)導(dǎo)致程序的錯(cuò)誤。固然雙set縮短迭代次數(shù),縮短real time,但真實(shí)工作需謹(jǐn)慎,按指針輸入,按條件輸出,不推薦使用雙set。


    一、文獻(xiàn)中的雙set,PDV過(guò)程

    程序如下:

    /**sampledataset**/

    data bonus_criteria;

    input low high factor @@;

    cards;

    0500 0.1

    5011000 0.2

    10012000 0.4

    20015000 0.6

    500110000 0.8

    ;

    run;


    data sale_amount;

    input name $ salary amount @@;

    cards;

    Jim500 200

    Tom1000 700

    Lily2000 1500

    Saly700 300

    Gery3500 3000

    Coliy4500 6000

    Jony5000 3000

    lary2000 300

    Sam1040 200

    Jamy5600 1200

    Bob3400 500

    Salla2600 24

    ;

    run;


    /**Use SET/SET join two datasets to derive new variable **/

    proc sort data=bonus_criteria;

    by low high;

    run;


    proc sort data=sale_amount;

    by amount;

    run;


    data bonus;

    set sale_amount ;

    do while(not(low le amount le high));

    set bonus_criteria ;

    end;

    bonus=salary*factor;

    run;


    1.編譯后,PDV含有6個(gè)顯性變量:low high factor name salary amount. 同時(shí)這6個(gè)變量初始化值變?yōu)槿笔?/p>

      

    Low

      

    High



    Factor



    Name



    Salary



    Amount


      

    .

      

    .



    .



    .



    .



    .


    2.接下來(lái)系統(tǒng)讀取sale_amount中的第一條觀測(cè),進(jìn)入Do循環(huán)。

      

    Name

      

    Salary



    Amount


      

    Salla

      

    2000



    24


    由于amount=24 ,并且此時(shí)程序沒(méi)執(zhí)行到sale_criteria,又因?yàn)閘ow=. high=. 所以low le amount le high為假,所以while語(yǔ)句中為真,執(zhí)行DO語(yǔ)句

    3. 在語(yǔ)句里,第二個(gè)set語(yǔ)句產(chǎn)生另一個(gè)數(shù)據(jù)指針,該指針將指向表bonus_criteria的第一條觀測(cè)

      

    Low

      

    High



    Factor


      

    0

      

    500



    0.1


    然后執(zhí)行end語(yǔ)句,并返回Do語(yǔ)句

    4. 再次判斷while語(yǔ)句,not( 0 le 24 le 500 ) 為假,跳出Do while循環(huán),執(zhí)行后面的語(yǔ)句bonus=salary * factor; 并output到bonus的第一條觀測(cè)。

      

    Name

      

    Salary



    Amount



    Low



    High



    Factor



    Bonus


      

    Salla

      

    2600



    24



    0



    500



    0.1



    260



    5. 返回data步開(kāi)頭,PDV清空sale_amount中的所有變量值,但不會(huì)清空bonus_criteria中的值,因?yàn)楸韇onus_criteria的指針仍然停留在第一條觀測(cè)上,且程序還未執(zhí)行到第二個(gè)set語(yǔ)句。


    6. 讀取sale_amount的第二條數(shù)據(jù)

      

    Name

      

    Salary



    Amount


      

    Jim

      

    500



    200


    進(jìn)入Do循環(huán),判斷while語(yǔ)句,由于未執(zhí)行到下一個(gè)set語(yǔ)句,bonus_critera的所有變量不被清空,0 le 200 le 500為真, not ( 0 le 200 le 500) 為假,跳到end結(jié)束,執(zhí)行bonus=salary * factor; 并output到bonus的第二條觀測(cè)

      

    Name

      

    Salary



    Amount



    Low



    High



    Factor



    Bonus


      

    Salla

      

    2600



    24



    0



    500



    0.1



    260


      

    Jim

      

    500



    200



    0



    500



    0.1



    50



    7.跳到data步開(kāi)始,讀取sale_amount第三條觀測(cè)…以此類推




    已有 1 人評(píng)分論壇幣 收起 理由
    hsubin + 5 精彩帖子

    總評(píng)分: 論壇幣 + 5   查看全部評(píng)分

    板凳
    消散2 發(fā)表于 2018-8-9 22:39:51 |只看作者 |壇友微信交流群

    二、文獻(xiàn)中如果不排序產(chǎn)生的錯(cuò)誤,PDV過(guò)程

    程序如下(數(shù)據(jù)集產(chǎn)生過(guò)程不再贅述)

    data bonus;

    set sale_amount ;

    do while(not(low le amount le high));

    set bonus_criteria ;

    end;

    bonus=salary*factor;

    run;

    1.編譯后,PDV含有6個(gè)顯性變量:low high factor name salary amount. 同時(shí)這6個(gè)變量初始化值變?yōu)槿笔?/p>

      

    Low

      

    High

    Factor

    Name

    Salary

    Amount

    .

    .

    .

    .

    .

    .

    2.接下來(lái)系統(tǒng)讀取sale_amount中的第一條觀測(cè),進(jìn)入Do循環(huán)。

      

    Name

      

    Salary

    Amount

    Jim

    500

    200

    由于amount=200 ,并且此時(shí)程序沒(méi)執(zhí)行到sale_criteria,又因?yàn)閘ow=. high=. 所以low le amount le high為假,所以while語(yǔ)句中為真,執(zhí)行DO語(yǔ)句

    3. 在語(yǔ)句里,第二個(gè)set語(yǔ)句產(chǎn)生另一個(gè)數(shù)據(jù)指針,該指針將指向表bonus_criteria的第一條觀測(cè)

      

    Low

      

    High

    Factor

    0

    500

    0.1

    然后執(zhí)行end語(yǔ)句,并返回Do語(yǔ)句

    4. 再次判斷while語(yǔ)句,not( 0 le 200 le 500 ) 為假,跳出Do while循環(huán),執(zhí)行后面的語(yǔ)句bonus=salary * factor; 并output到bonus的第一條觀測(cè)。

      

    Name

      

    Salary

    Amount

    Low

    High

    Factor

    Bonus

    Jim

    500

    200

    0

    500

    0.1

    50

    5. 返回data步開(kāi)頭,PDV清空sale_amount中的所有變量值,但不會(huì)清空bonus_criteria中的值,因?yàn)楸韇onus_criteria的指針仍然停留在第一條觀測(cè)上,且程序還未執(zhí)行到第二個(gè)set語(yǔ)句。

    6. 讀取sale_amount的第二條數(shù)據(jù)

      

    Name

      

    Salary

    Amount

    Tom

    1000

    700

    進(jìn)入Do循環(huán),判斷while語(yǔ)句,由于未執(zhí)行到下一個(gè)set語(yǔ)句,bonus_critera的所有變量不被清空,0 le 700 le 500為假, not ( 0 le 200 le 500) 為真,執(zhí)行Do語(yǔ)句。

    7.再第二個(gè)set執(zhí)行前,清空PDV中關(guān)于Bonus_criteria中的所有變量,第二指針指到bonus_criteria的第二條觀測(cè)

      

    Low

      

    High

    Factor

    501

    1000

    0.2

    執(zhí)行END語(yǔ)句,返回Do語(yǔ)句

    8. 判斷while語(yǔ)句not( 501 le 700 le 1000) 為假,跳過(guò)Do循環(huán),執(zhí)行bonus=salary * factor; 并output到bonus的第二條觀測(cè)。

      

    Name

      

    Salary

    Amount

    Low

    High

    Factor

    Bonus

    Jim

    500

    200

    0

    500

    0.1

    50

    Tom

    1000

    700

    501

    1000

    0.2

    200

    7.跳到data步開(kāi)始,清空PDV中sale_amount的變量值,讀取sale_amount第三條觀測(cè)

      

    Name

      

    Salary

    Amount

    Lily

    2000

    1500

    判斷while語(yǔ)句,not( 501le 1500 le 1000) 為真,執(zhí)行Do語(yǔ)句,清空PDV中bonus_criteria的變量值,讀取bonus_criteria的第三條觀測(cè)

      

    Low

      

    High

    Factor

    1001

    2000

    0.4

    執(zhí)行END語(yǔ)句,返回Do語(yǔ)句,判斷while語(yǔ)句 not( 1001 le 1500 le 2000)為假,跳過(guò)Do語(yǔ)句,執(zhí)行bonus=salary * factor; 并output到bonus的三條觀測(cè)。

      

    Name

      

    Salary

    Amount

    Low

    High

    Factor

    Bonus

    Jim

    500

    200

    0

    500

    0.1

    50

    Tom

    1000

    700

    501

    1000

    0.2

    200

    Lily

    2000

    1500

    1001

    2000

    0.4

    800

    8.返回data步開(kāi)始, PDV清空sale_amount中的所有變量值,讀取sale_amount的第四條數(shù)據(jù)

      

    Name

      

    Salary

    Amount

    Saly

    700

    300

    進(jìn)入Do語(yǔ)句,判斷while 語(yǔ)句,not(1001 le 300 le2000) 為真,執(zhí)行Do語(yǔ)句,清空PDV中bonus_criteria的變量值,讀取bonus_criteria的第四條觀測(cè)

      

    Low

      

    High

    Factor

    2001

    5000

    0.6

    執(zhí)行end語(yǔ)句,返回do語(yǔ)句,再次判斷while語(yǔ)句

    注意:此時(shí)會(huì)一直陷入Do的循環(huán),因?yàn)閘ow和high越來(lái)越大,sale_amount的第四條數(shù)據(jù)的amount=300,not(low le amount le high) 從此一直為真。在讀取sale_amount的最后一條觀測(cè)后,由于sale_amount無(wú)數(shù)據(jù)可讀,所以sas會(huì)跳轉(zhuǎn)到下一個(gè)data步或者proc步等。于是會(huì)產(chǎn)生

    sale_amount中讀取4條記錄(第四條記錄讀取并進(jìn)入循環(huán)但最終都沒(méi)有被output)

    bonus_criteria中讀取5條全部記錄(后面一直在循環(huán),并且data步終止也是因?yàn)閿?shù)據(jù)讀完)

    bonus觀測(cè)中含有3條數(shù)據(jù)。


    報(bào)紙
    消散2 發(fā)表于 2018-8-9 22:42:33 |只看作者 |壇友微信交流群

    一、文獻(xiàn)中的雙set,PDV過(guò)程

    程序如下:

    /**sampledataset**/

    data bonus_criteria;

    input low high factor @@;

    cards;

    0500 0.1

    5011000 0.2

    10012000 0.4

    20015000 0.6

    500110000 0.8

    ;

    run;

    data sale_amount;

    input name $ salary amount @@;

    cards;

    Jim500 200

    Tom1000 700

    Lily2000 1500

    Saly700 300

    Gery3500 3000

    Coliy4500 6000

    Jony5000 3000

    lary2000 300

    Sam1040 200

    Jamy5600 1200

    Bob3400 500

    Salla2600 24

    ;

    run;

    /**Use SET/SET join two datasets to derive new variable **/

    proc sort data=bonus_criteria;

    by low high;

    run;

    proc sort data=sale_amount;

    by amount;

    run;

    data bonus;

    set sale_amount ;

    do while(not(low le amount le high));

    set bonus_criteria ;

    end;

    bonus=salary*factor;

    run;

    1.編譯后,PDV含有6個(gè)顯性變量:low high factor name salary amount. 同時(shí)這6個(gè)變量初始化值變?yōu)槿笔?/p>

      

    Low

      

    High

    Factor

    Name

    Salary

    Amount

    .

    .

    .

    .

    .

    .

    2.接下來(lái)系統(tǒng)讀取sale_amount中的第一條觀測(cè),進(jìn)入Do循環(huán)。

      

    Name

      

    Salary

    Amount

    Salla

    2000

    24

    由于amount=24 ,并且此時(shí)程序沒(méi)執(zhí)行到sale_criteria,又因?yàn)閘ow=. high=. 所以low le amount le high為假,所以while語(yǔ)句中為真,執(zhí)行DO語(yǔ)句

    3. 在語(yǔ)句里,第二個(gè)set語(yǔ)句產(chǎn)生另一個(gè)數(shù)據(jù)指針,該指針將指向表bonus_criteria的第一條觀測(cè)

      

    Low

      

    High

    Factor

    0

    500

    0.1

    然后執(zhí)行end語(yǔ)句,并返回Do語(yǔ)句

    4. 再次判斷while語(yǔ)句,not( 0 le 24 le 500 ) 為假,跳出Do while循環(huán),執(zhí)行后面的語(yǔ)句bonus=salary * factor; 并output到bonus的第一條觀測(cè)。

      

    Name

      

    Salary

    Amount

    Low

    High

    Factor

    Bonus

    Salla

    2600

    24

    0

    500

    0.1

    260

    5. 返回data步開(kāi)頭,PDV清空sale_amount中的所有變量值,但不會(huì)清空bonus_criteria中的值,因?yàn)楸韇onus_criteria的指針仍然停留在第一條觀測(cè)上,且程序還未執(zhí)行到第二個(gè)set語(yǔ)句。

    6. 讀取sale_amount的第二條數(shù)據(jù)

      

    Name

      

    Salary

    Amount

    Jim

    500

    200

    進(jìn)入Do循環(huán),判斷while語(yǔ)句,由于未執(zhí)行到下一個(gè)set語(yǔ)句,bonus_critera的所有變量不被清空,0 le 200 le 500為真, not ( 0 le 200 le 500) 為假,跳到end結(jié)束,執(zhí)行bonus=salary * factor; 并output到bonus的第二條觀測(cè)

      

    Name

      

    Salary

    Amount

    Low

    High

    Factor

    Bonus

    Salla

    2600

    24

    0

    500

    0.1

    260

    Jim

    500

    200

    0

    500

    0.1

    50

    7.跳到data步開(kāi)始,讀取sale_amount第三條觀測(cè)…以此類推


    地板
    hsubin 在職認(rèn)證  發(fā)表于 2018-8-9 23:28:25 |只看作者 |壇友微信交流群
    很有意思的一個(gè)例子,期待高手來(lái)解讀
    7
    l1i2n3i4n5g 在職認(rèn)證  發(fā)表于 2018-8-10 22:15:47 |只看作者 |壇友微信交流群
    消散2 發(fā)表于 2018-8-9 22:39
    嗯我搞明白了,供大家參考,歡迎指正,共同進(jìn)步
    結(jié)論:雙set不利于程序分享,并且如果存在排序問(wèn)題會(huì)導(dǎo)致嚴(yán) ...
    受益匪淺!

    本版微信群
    加好友,備注cda
    拉您進(jìn)交流群

    京ICP備16021002-2號(hào) 京B2-20170662號(hào) 京公網(wǎng)安備 11010802022788號(hào) 論壇法律顧問(wèn):王進(jìn)律師 知識(shí)產(chǎn)權(quán)保護(hù)聲明   免責(zé)及隱私聲明

    GMT+8, 2024-12-23 03:21