小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SAS系列07:SAS數(shù)據(jù)整理(三)

 松哥精鼎統(tǒng)計(jì) 2020-10-23
導(dǎo)讀

     前面我們介紹在實(shí)際應(yīng)用中,整理和分析的數(shù)據(jù)可能是來自多個數(shù)據(jù)源,這就需要對多個數(shù)據(jù)集進(jìn)行處理,如合并、轉(zhuǎn)置、修改、更新等操作。今天我們將介紹數(shù)據(jù)集的處理。(詳見圖4-1)

一、數(shù)據(jù)的理解






圖4-1  數(shù)據(jù)預(yù)處理流程
         

二、數(shù)據(jù)的預(yù)處理






      數(shù)據(jù)的預(yù)處理是為數(shù)據(jù)的最終分析結(jié)果提供質(zhì)量保證,即從原始數(shù)據(jù)中構(gòu)造用于分析的最終數(shù)據(jù)集,包括:數(shù)據(jù)集的合并、變量和觀測的選擇、數(shù)據(jù)轉(zhuǎn)換和清理等。接下來將從SAS數(shù)據(jù)集的調(diào)用、變量的處理、觀測的處理、數(shù)據(jù)集的處理四個方面來介紹SAS實(shí)現(xiàn)。

(四)數(shù)據(jù)集的處理

4.1 數(shù)據(jù)集的縱向合并


       數(shù)據(jù)集的縱向合并是指將兩個或兩個以上數(shù)據(jù)集的觀測首尾連接成一個數(shù)據(jù)集。數(shù)據(jù)集的縱向合并可以通過DATA步的SET語句、PROC APPEND程序、PROC SQL程序來實(shí)現(xiàn)。

*===創(chuàng)建合并數(shù)據(jù)集,兩個數(shù)據(jù)集有重復(fù)觀測;PROCIMPORTDATAFILE="E:\studyfile\Jindingtongji\SAS\score.xlsx"      OUT=score_a      DBMS=excel REPLACE;      RANGE="A$";RUN;PROCIMPORTDATAFILE="E:\studyfile\Jindingtongji\SAS\score.xlsx" OUT=score_b      DBMS=excel REPLACE; RANGE="B$";RUN;
*===DATA步SET語句合并數(shù)據(jù)集,并刪除重復(fù)觀測;PROCSORTDATA=score_a;      BY name;RUN;PROCSORTDATA=Score_b;      BY name;RUN;DATA score;      SET score_a score_b; BY name;      IF first.name THEN OUTPUT;RUN;
*===DATA步SET語句合并數(shù)據(jù)集,PROCSORT刪除重復(fù)觀測;DATA score_ab;      SET score_a score_b;RUN;PROCSORTdata=score_ab      OUT=score_ab1      DUPOUT=score_dup  /*重復(fù)觀測輸出到score_dup數(shù)據(jù)集*/      NODUPKEY;      BY name;RUN;
*===DATA步SET語句合并數(shù)據(jù)集,PROCSORT過程步中的NODUP=選項(xiàng)刪除重復(fù)觀測;DATA score1;      SET score_a score_b;RUN;PROC SORT DATA=score_ab OUT=score_ab1 NODUP;      BY name;RUN;
*===PROC APPEND過程縱向合并數(shù)據(jù)集;PROC APPENDbase=score_a data=score_b;RUN;PROC PRINTDATA=score_a;RUN;
*===PROC SQL并運(yùn)算生成數(shù)據(jù)集,刪除重復(fù)觀測;PROCSQL;      CREATETABLEscore_u AS      SELECT *      FROM score_a      UNION  /*score_u數(shù)據(jù)集包含數(shù)據(jù)集score_a                  和數(shù)據(jù)集score_b中所有的觀測,刪除重復(fù)觀測*/      SELECT *      FROM score_b;QUIT;
*===PROC SQL外并數(shù)據(jù)集,未刪除重復(fù)觀測;PROCSQL;      CREATETABLEscore_oc as      SELECT *      FROM score_a      OUTERUNIONCORR       SELECT *      FROM score_b;QUIT;
*===PROC SQL差運(yùn)算生成數(shù)據(jù)集;PROCSQL;      CREATETABLEscore_e AS      SELECT *      FROM score_a      EXCEPT /*從數(shù)據(jù)集score_a中刪除數(shù)據(jù)集score_b的行,                        兩個數(shù)據(jù)集有一個重復(fù)觀測,新生成的數(shù)據(jù)集                        不包括該重復(fù)觀測和score_b的觀測*/      SELECT *      FROM score_b;QUIT;
*===PROC SQL交運(yùn)算生成數(shù)據(jù)集;PROCSQL;      CREATETABLEscore_i AS      SELECT *      FROM score_a      INTERSECT  /*score_i數(shù)據(jù)集僅包含數(shù)據(jù)集score_a                              和數(shù)據(jù)集score_b中共同的觀測*/      SELECT *      FROM score_b;QUIT;

4.2 數(shù)據(jù)集的橫向合并

*===創(chuàng)建數(shù)據(jù)集;DATA score1;      INPUT id $ name $ gender $ @@;      DATALINES;X001 Jack MX002 Joyce  FX003 LouiseFX004 Alice  FX005 James  MX006 ThomasMX007 John   MX008 Jane   FX009 Janet  F;RUN;DATA score2;      INPUT id $ chinese math english@@;      DATALINES;X001 93    55    62X002 63    57    83X003 50    69    88X005 60    62    84X006 95    75    78X008 66    98    51X010 79    81    92X011 77    78    58X012 81    89    88;RUN;
*===DATA步MERGE語句全連接;PROCSORTdata=score1;      BY id;RUN;PROCSORTdata=score2;      BY id;RUN;DATA score_m;      MERGE score1 score2;      BY id;      IF s1 or s2;RUN;
*===DATA步MERGE語句左連接;DATA score_ml;      MERGE score1(in=s1) score2(in=s2);      BY id;      IF s1;RUN;
*===DATA步MERGE語句右連接;DATA score_mr;      MERGE score1(in=s1) score2(in=s2);      BY id;      IF s2;RUN;
*===DATA步MERGE語句內(nèi)連接;DATA score_mi;      MERGE score1(in=s1) score2(in=s2);      BY id;      IF s1 and s2;RUN;
      DATA步的MERGE語句可以用BY語句也可以不用BY語句實(shí)現(xiàn)橫向合并。用BY語句的合并稱為匹配合并,匹配合并在數(shù)據(jù)集處理中應(yīng)用非常廣泛。SAS在編譯MERGE命令階段,會按照數(shù)據(jù)集的排列排序,依次讀入所有數(shù)據(jù)集中變量的描述部分,并置于PDV中,若不同的數(shù)據(jù)集中有同名的變量,則要求其數(shù)據(jù)類型必須相同,長度以第一次出現(xiàn)的變量為準(zhǔn)。

    執(zhí)行MERGE命令時,SAS將各輸入數(shù)據(jù)集中的觀測按BY語句指定的變量進(jìn)行匹配,在DATA步的每次循環(huán)中依次讀入BY語句組合的每條觀測,如遇到同名變量,先讀入的變量值將會被后讀入的變量值覆蓋。從數(shù)據(jù)集中讀入的變量值,會自動保留到BY變量值在所有輸入數(shù)據(jù)集中都改變?yōu)橹埂?/span>不用BY語句的通常稱為一對一合并,在實(shí)際應(yīng)用時,一對一合并的情況并不多見,因此在這里沒有介紹。
*===PROC SQL全連接;PROCSQL;      CREATETABLEscore12_f AS      SELECT *      FROM score1 FULLJOIN score2      ON score1.id=score2.id;QUIT;
*===PROC SQL左連接;PROCSQL;      CREATETABLEscore12_l AS      SELECT *      FROM score1 LEFTJOIN score2      ON score1.id=score2.id;QUIT;
*===PROC SQL右連接;PROCSQL;      CREATETABLEscore12_r AS      SELECT *      FROM score1 RIGHTJOIN score2      ON score1.id=score2.id;QUIT;
*===PROC SQL內(nèi)連接;PROCSQL;      CREATETABLEscore12_in AS      SELECT *      FROM score1 INNERJOIN score2      ON score1.id=score2.id;QUIT;

4.3 行列轉(zhuǎn)置

      在實(shí)際中,我們需要對數(shù)據(jù)集的行列進(jìn)行轉(zhuǎn)置來滿足我們進(jìn)一步分析數(shù)據(jù)。數(shù)據(jù)集的行列轉(zhuǎn)置可能通過DATA步和PROC TRANSPOSE過程步來實(shí)現(xiàn)。PROC TRANSPOSE過程步的語法如下:

*===創(chuàng)建數(shù)據(jù)集;DATA score;      INPUT id $ chinese math english@@;      DATALINES;X001 93    55    62X002 63    57    83X003 50    69    88X005 60    62    84X006 95    75    78X008 66    98    51X010  79    81    92X011  77    78    58X012  81    89    88;RUN;*===PROCTRANSPOSE行轉(zhuǎn)置表列;PROCTRANSPOSEdata=score out=score_tr;      VAR chinese math english; /*列出要轉(zhuǎn)置的變量名*/      BY id; /*對每個BY組進(jìn)行轉(zhuǎn)置,在輸入數(shù)據(jù)集中沒有被轉(zhuǎn)置的變量*/RUN;*===PROCTRANSPOSE列轉(zhuǎn)置行;PROCTRANSPOSEdata=score_tr out=score1(DROP=_name_);      VAR score; /*列出要轉(zhuǎn)置的變量名*/      BY id; /*對每個BY組進(jìn)行轉(zhuǎn)置,在輸入數(shù)據(jù)集中沒有被轉(zhuǎn)置的變量*/      ID course; /*轉(zhuǎn)置后數(shù)據(jù)集的變量名*/RUN;
*===DATA步DO-END+ARRAY實(shí)現(xiàn)行轉(zhuǎn)置列;DATA score_do(KEEP=id course score);      SET score;      ARRAY courses{3} chinese math english; /*需要轉(zhuǎn)置的變量*/      DO i=1to3;            course=vname(courses{i}); /*轉(zhuǎn)置后的變量名*/            score=courses(i); /*轉(zhuǎn)置后的變量值*/            OUTPUT;      END;RUN;*===DATA步的DO-END語句+ARRAY語句實(shí)現(xiàn)列轉(zhuǎn)置行;DATA score2(DROP=i course score);      FORMAT id chinese math english;      ARRAY name{3} chinese math english; /*轉(zhuǎn)置后的變量名*/      DO i=1TO3;      SET score_do;      name{i}=score; /*轉(zhuǎn)置后的變量值*/      END;RUN;

       PROC TRANSPOSE是一個比較復(fù)雜的過程,在處理大數(shù)據(jù)集時會非常耗費(fèi)時間,而DATA步行列轉(zhuǎn)置的運(yùn)行速度要快的多。對于多元分析和重復(fù)測量數(shù)據(jù)分析時進(jìn)行行列轉(zhuǎn)置,PROC TRANSPOSE是非常方便的。PROC TRANSPOSE與DATA步語句組合,可以實(shí)現(xiàn)很多非常復(fù)雜的行列轉(zhuǎn)置。需要注意的是,DATA步行轉(zhuǎn)列與列轉(zhuǎn)行的差別:(1)行轉(zhuǎn)列時,DO循環(huán)包含SET語句,不使用OUTPUT語句;(2)列轉(zhuǎn)行時,DO循環(huán)獨(dú)立于SET語句,需要使用OUTPUT語句。整理不易,歡迎點(diǎn)亮再看哦!

參考文獻(xiàn):

[1] 谷鴻秋. SAS編程演義[M]. 北京:清華大學(xué)出版社,2017.

[2] 高惠璇. SAS系統(tǒng)Base SAS軟件使用手冊[M]. 北京:中國統(tǒng)計(jì)出版社,1997.

[3] https://support./en/software/base-sas-support.html.

[4] 夏莊坤, 徐唯, 潘紅蓮, 等. 深入解析SAS—數(shù)據(jù)處理、分析優(yōu)化與商業(yè)應(yīng)用[M]. 北京: 機(jī)械工業(yè)出版社,2014.

精鼎特邀

【贈人玫瑰,手留余香】

----------------------------------------------

SAS系列06:SAS數(shù)據(jù)整理(二)

SAS系列05:SAS數(shù)據(jù)整理(一)

SAS系列04:SAS數(shù)據(jù)導(dǎo)入

SAS系列03:SAS入門(二)之SAS編程語言基礎(chǔ)

SAS系列02:SAS入門(一)

SAS系列01:統(tǒng)計(jì)分析航空母艦-SAS簡介

整理不易,歡迎點(diǎn)亮再看!

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多