日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SAS 对数据的拼接与串接

發布時間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAS 对数据的拼接与串接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SAS 對數據的拼接與串接

使用SAS對數據進行串接、合并、更新與修改。

1. 數據集的縱向串接

數據集的縱向串接指的是,將兩個或者多個數據集首尾相連,形成 一個新的數據集。

對數據集的縱向串接可以通過以下兩種方法實現:

  • ·使用SAS DATA步的SET語句。
  • ·使用SAS過程步的APPEND過程。
  • 1.1 使用SET語句實現縱向串接?

    1.基本形式?

    使用SET語句實現縱向串接的基本形式如下:?

    DATA 新數據集; SET 數據集1 數據集2 <數據集3 數據集4 …>; RUN;

    其中:

    • ·SET語句中的數據集1、數據集2都為輸入數據集。
    • ·串接后的數據存儲在DATA語句的新數據集中。
    • ·SET語句可以同時讀入多個數據集,新數據集將包含各輸入數據集 中的所有變量。

    對數據集Work.New_Emloyee和Work.Old_Emplyee進行串 接。

    以下代碼創建了數據集:

    data work.New_Employee; input Emp_ID $ Emp_Name $ @@; datalines; ET001 Jimmy ED003 Emy EC002 Alfred EQ004 Kim ; run; data work.Old_Employee; input Emp_ID $ Emp_Name $ @@; datalines; EQ122 Molly ET121 Dillon ET123 Helen ED124 John ; run

    數據集Work.New_Emloyee和Work.Old_Emplyee含有相同的變量Emp_ID和Emp_Name。串接兩個數據集的示例代碼如下:

    data work.Employee; set work.Old_Employee work.New_employee ; run; proc print data=work.Old_Employee; title 'Old Employee'; run; proc print data=work.New_Employee; title 'New Employee'; run; proc print data=work.Employee; title 'All Employee'; run;

    從輸出內容中可以觀察到新數據集work.Employee包含了2個變量和8條觀測,work.Old_Employee的觀測直接加在了work.New_Employee的 后面,名稱相同的字段放在同一變量下。

    如果Work.New_Employee和Work.Old_Emplyee中含有的變量不全一 致,將這兩個數據集進行串接時,情況會是如何呢?

    以下代碼在 Work.New_Emloyee和Work.Old_Emplyee中分別用IF語句創建了新變量 Dept和Gender。

    data work.New_Employee_Dept; set work.New_Employee; if substr(Emp_ID,2,1)="T" then Dept="TSG"; else if substr(Emp_ID,2,1)="Q" then Dept="QSG"; else if substr(Emp_ID,2,1)="D" then Dept="DSG"; else if substr(Emp_ID,2,1)="C" then Dept="CSG"; run; data work.Old_Employee_Gen; set work.Old_Employee; if mod(substr(Emp_ID,length((trim(Emp_ID))),1),2)=0 then Gender="F"; else Gender="M"; run;

    對數據集Work.New_Emloyee_Dept和Work.Old_Emplyee_Gen進行串接。 示例代碼如下:

    data work.Employee_Update; set work.Old_Employee_Gen work.New_employee_Dept; run; proc print data=work.Employee_Update; title 'All Employee Update'; run;

    新數據集work.Employee_Update和work.Employee一樣含有8條觀 測,但是work.Employee_Update含有4個變量,依次為Emp_ID、 Emp_Name、Gender和Dept。由于work.Old_Employee_Gen中不含有 Dept,因此串接后前4條觀測的Dept都為缺失值,同樣Gender在 work.New_Employee_Dept中不存在,串接后的后4條觀測其Gender都為 缺失值。

    1.2? 使用BY語句進行穿插串接

    在例4.2中,如果要讓串接后的新數據集中的8條觀測按照Emp_ID的 升序排列,該如何操作呢?這時需要引入穿插串接的概念。穿插串接就是使得新數據集的觀測按照一定順序排列的串接方法。

    基本形式如下:

    DATA 新數據集; SET 數據集1 數據集2 <數據集3 數據集4 … >; BY 變量1 <變量2 變量3 變量4 … >; RUN;

    BY語句在處理多個數據集時經常使用,為了更好地理解本章后面 的內容,這里需要引入BY變量、BY變量組、BY變量值和BY組合的概 念。

    • ·BY語句中的變量稱為BY變量,一個BY語句中可以有多個BY變量。
    • ·當BY語句中有多個變量時,稱這些變量為BY變量組。
    • ·BY變量值指的是BY變量的取值。
    • ·BY組合指的是具有相同BY變量值的觀測的集合。當有多個BY變量時,BY組合就是使得所有BY變量的取值完全相同的觀測的集合。

    為了便于理解,在本章后面的闡述中,BY變量既代表一個BY變 量,也可以是多個BY變量。

    在使用BY語句時,所有輸入數據集都必須是按BY變量排過序,或 者有基于BY變量建立的索引(在以后的所有代碼中,使用BY語句都有 這樣的要求)。串接完畢后,新數據集中的觀測也將按照BY變量排 序。?

    對數據集Work.New_Emloyee_Dept和Work.Old_Emplyee_Gen進行穿插串接。

    由于work.New_Employee_Dept和work.Old_Employee_Gen都沒有按 照Emp_ID排序,在對這兩個數據集進行穿插串接時,首先必須對其按 Emp_ID排序。

    proc sort data=work.New_Employee_Dept; by Emp_ID; run; proc sort data=work.Old_Employee_Gen; by Emp_ID; run; data work.Employee_Int; set work.Old_Employee_Gen work.New_Employee_Dept; by Emp_ID; run; proc print data=work.Employee_Int; title 'All Employee Interleaving by ID'; run;

    1.3.使用LENGTH語句

    當輸入數據集中同名變量的長度不一樣時,新數據集中該變量的長度等于SET語句中第一個數據集中對應變量的長度。在對多個數據集進 行串接時,最好先檢查字符型變量的長度,避免在讀取變量值時造成截 斷。如有需要,可以在使用SET語句之前使用LENGTH語句來定義變量 的長度。

    使用LENGTH語句定義變量長度的基本形式如下:

    LENGTH 變量1 < $ >長度 <變量2 < $ >長度 …>;

    在定義字符型變量的長度時,需在長度前面加上$符號。

    使用LENGTH語句將數據集work.Employee中Emp_ID的長度定義為15。 示例代碼如下:

    data work.Employee; length Emp_ID $15; set work.New_Employee work.Old_employee; by Emp_ID; run;

    1.4? 使用選項RENAME=

    在上面的例子中,輸入數據集中相同含義的字段正好同名,但是在很多情況下,由于數據來自于不同的部門系統和時期,輸入數據集中相 同含義的變量往往不具有相同的變量名。例如,在一個數據集中表示員 工ID的變量名叫ID,在另一個數據集中表示員工ID的變量名叫 Emp_ID,在進行數據拼接的時候,如果不做另外的處理,這兩個變量 將會被SAS認為是兩個不同的字段,并分別存儲在兩個不同的變量下。 這時可以使用RENAME=選項將兩個數據集中的變量名改成一致的名 稱,避免出現前面描述的問題。

    使用RENAME=選項的基本形式如下:

    數據集(RENAME= (原變量名1 = 新變量名1 <原變量名2 = 新變量名2 … >));

    2? 使用APPEND過程實現縱向串接

    使用APPEND過程進行數據集串接的基本形式如下:

    PROC APPEND BASE=主數據集 <DATA=追加數據集> <FORCE>;

    其中:

    • ·主數據集表示需要增加觀測的數據集。該主數據集可以是已經存 在的數據集,也可以是不存在的數據集。當主數據集不存在時,在執行完APPEND過程后,將生成主數據集,并將追加數據集的觀測復制到主數據集中。
    • ·追加數據集中包含了需要被添加到主數據集中的觀測。這個語句可以是默認的,此時,SAS會將當前數據集的觀測添加到主數據集的后 面。當前數據集指的是SAS系統最近一次生成的數據集。通常情況下, 為了保證程序的可讀性,不建議默認。
    • ·FORCE選項會強制將追加數據集中的觀測添加到主數據集中。后面將會介紹需要使用FORCE選項的3種情況及其結果。

    使用APPEND過程進行串接時,SAS不會處理主數據集中的觀測, 而是直接將追加數據集的觀測添加到主數據集最后一條觀測的后面,且 變量僅包含主數據集中的變量。

      運用APPEND過程將work.New_Employee_Dept和 work.Old_employee_Gen兩個數據集進行縱向串接,并將串接后的數據 集保存在work.Old_employee_Gen中(前面在介紹SET語句的時候,已經 介紹并操作過這兩個數據集)。

      兩個數據集的基本情況如圖所示。 兩個數據集所含的變量不全一致,需要使用FORCE語句來進行串接,代碼如下:

    proc append base=work.Old_Employee_Gen data=work.New_Employee_Dept FORCE; run;

    串接后的數據集work.Old_Employee_Gen如圖所示。

    從上面的例子可以觀察到,串接后work.Old_Employee_Gen中僅包含原來含有的變量,觀測數為兩個數據集中的觀測之和。這里使用了 FORCE選項,如果去掉FORCE選項,串接將失敗,這是因為追加數據 集work.New_employee_dept中含有主數據集沒有的變量。

    使用APPEND過程時特別需要注意FORCE選項的使用,下面介紹需要使用FORCE選項的3種情況,以及使用FORCE選項后的結果。

    ·第一種情況,如果追加的數據集中存在不包含在主數據集中的變量,使用FORCE選項將會使得串接成功,但僅存在于追加數據集中的變量不會被添加到主數據集中。

    ·第二種情況,如果同名變量在主數據集和追加數據集中的類型不一樣,那么需要使用FORCE選項,但是追加進主數據集的觀測對應的這個變量的值為缺失。

    ·第三種情況,如果同名變量在追加數據集中的長度大于主數據集中的長度,那么需要使用FORCE選項,在執行過程中,追加數據集中的變量值可能會被截斷。

    當主數據集中包含追加數據集中不含有的變量時,串接成功,同時 系統會在日志中生成警告,并且追加數據集中不含有的變量之值都為缺 失。另外,當兩個數據集中同名變量的屬性不一致時,將沿用主數據集 中變量的屬性。

    在企業交易系統數據的維護過程中可以使用APPEND過程,例如主 數據集可以表示歷年的交易記錄,追加數據集可以表示每年新增的交易 記錄,使用APPEND過程可以將每年新增的銷售記錄方便快速地串接到 歷年的銷售記錄中。

    注意 在使用APPEND過程時,一定要注意觀察日志信息,避免產生數據缺失、截斷等異常結果。

    1. SET語句與APPEND過程的比較

    對兩個數據集進行縱向串接時,如果兩個數據集中的變量名稱和屬性都相同,使用SET語句和APPEND過程,可以得到完全一樣的結果。 但是使用APPEND過程的效率比使用SET語句高,尤其是當主數據集的觀測量很大時,這是因為APPEND過程不對主數據集的觀測進行操作, 而是直接把追加數據集的觀測加到主數據集的后面。

    當輸入數據集的個數、所包含的變量或者變量屬性不一致時,兩種 方法有較大差別,如表4.1所示。

    2表4.1 SET語句和APPEND過程比較

    2 數據集的橫向合并

    數據集的橫向合并,指的是將兩個或多個數據集根據某種原則橫向 合并起來,形成新的數據集。SAS提供了MERGE語句來實現兩個或多 個數據集的橫向合并。數據的橫向合并主要分為以下兩種情況:

  • ?·不使用BY語句合并,也稱為一對一合并(左圖)。
  • ·使用BY語句合并,也稱為匹配合并(右圖)。
  • 1.? 不適用by語句實例代碼

    代碼如下: DATA WORK.COMBINED; MERGE WORK.DATA1 WORK.DATA2; RUN;

    2.? 使用by語句實例代碼

    DATA WORK.COMBINED; MERGE WORK.DATA1 WORK.DATA2; BY Year; RUN;

    2.1?不使用BY語句實現橫向合并

    不使用BY語句進行數據集橫向合并的基本形式如下:

    DATA 新數據集; MERGE 數據集1 數據集2 <數據集3 數據集4 … >; RUN;

    不使用BY語句進行數據集橫向合并時,對輸入數據集的排序沒有要求。

    某部門的主管決定在年終的時候對本部門的員工進行考 核,數據集work.staff中包含了員工的基本信息,而另一個數據集 work.schedule中包含了考核時間和地點。現在需要給每位員工分配考核 時間和地點。

    以下代碼創建了數據集。

    data work.staff; infile datalines dsd; length emp_name $20 title $15; input emp_name $ title $ ; datalines; Jacob Adams,Analyst Emily Anderson,Analyst Michael Arnold,Senior Analyst Hannah Baker,Manager Joshua Carter,Senior Analyst ; run; data work.time; input time date9. room $11-24; format time date9.; datalines; 01Dec2013 Meeting Room 1 02Dec2013 Meeting Room 2 03Dec2013 Meeting Room 1 03Dec2013 Meeting Room 2 04Dec2013 Meeting Room 3 04Dec2013 Meeting Room 1 ; run;

    其中,Emp_name表示員工姓名,title表示員工的職位,time表示考核時間,room表示和時間對應的會議室。現在將時間和會議室分配給各 員工,示例代碼如下:

    data work.schedule; merge staff time; run; proc print data= work.schedule; title "Schedule for Performance Management"; run;

    2.2 使用BY語句實現橫向合并

    使用BY語句進行數據集橫向合并的基本形式如下:

    DATA 新數據集; MERGE 數據集1 數據集2 <數據集3 數據集4 … >; BY 變量名1 <變量名2 變量名3 … >; RUN;

    和之前介紹SET語句時提及的一樣,當使用BY語句時,輸入數據集必須按BY變量排序。

    SAS在處理匹配合并的DATA步程序時,主要分以下兩個階段:

    • ·編譯階段,SAS在辨識出MERGE語句后,將按照其中數據集的排列順序,依次讀入所有數據集中變量的描述部分,包括DATA步中新創建變量的描述部分,并將所有變量置于PDV中。若不同的數據集中有同名的變量,則要求它們的數據類型必須相同,長度以第一次出現的變量為準。
    • ·執行階段,各輸入數據集中的觀測按BY變量進行匹配,在DATA 步的每次循環中依次讀入BY組合的每條觀測。如果遇到同名的變量,后讀入的變量值將覆蓋先讀入的變量值。由數據集中讀入的變量值,會自動地保留到BY變量值在所有輸入數據集中都改變為止。由DATA步新 創建的變量,其變量值在每次循環中都不能在PDV中自動保留,也就是說,在處理下一條數據之前它將被置為缺失值。

    1.BY變量值在所有數據集中唯一

    BY變量值在所有數據集中都是唯一的,即在任一輸入數據集中, 沒有兩條或兩條以上的觀測具有相同的BY變量值,這是最簡單的一種 情景。?

    據集ex.staff_personel中包含了員工的基本信息,如Emp_ID、姓名、部門,另一個數據集ex.sales_current_month包含了員工本月的業績信息,如Emp_ID、產品種類和銷售額,但是不含有員工姓名。現在欲制作一張報表展現員工本月業績,并在報表中包含員工姓名 和部門數據。

    首先得對ex.staff_personel和ex.sales_current_month按照Emp_ID進行排序,代碼如下:

    proc sort data=ex.staff_personel out=work.staff_personel; by Emp_ID; run; proc sort data=ex.sales_current_month out=work.sales_current_month; by Emp_ID; run;

    以下代碼實現了合并操作:

    data work.Staff_sales; merge work.staff_personel work.sales_current_month; by Emp_ID; run; proc print data=work.Staff_sales noobs; title'Staff Sales'; run;

    2.BY變量值在某一數據集中存在重復

    BY變量值在某一輸入數據集中存在重復值,即在其中一個輸入數據集中,含有兩條或兩條以上的觀測具有相同的BY變量值,也稱為一對多合并。在匹配過程中會遵循如下原則:由輸入數據集讀入的變量 值,會保留在PDV中,直到被下一個讀入的觀測值覆蓋或該BY組合處 理完畢被重置為缺失值為止。接下來通過一個簡單的例子來具體講解這一原則。

    數據集ex.sales_three_month中包含了最近3個月 的績效信息,每個員工每個月都有一條記錄,現在欲制作一個報告顯示 員工最近3個月的績效信息,并顯示員工的姓名和部門。

    這里Emp_ID變量值在輸入數據集中不再是唯一的。以下代碼可以 實現員工信息和最近3個月績效信息的匹配:

    proc sort data=ex.staff_personel out=work.staff_personel; by Emp_id; run; proc sort data=ex.sales_three_month out=work.sales_three_month; by Emp_id; run; data work.staff_report; merge work.staff_personel work.sales_three_month; by Emp_id; run; proc print data=work.staff_personel noobs; title "Staff Information"; run; proc print data=work.sales_three_month noobs; title "Sales For Three Months"; run; proc print data=work.staff_report noobs; title "Staff Report"; run;

    3.BY變量值在多個數據集中存在重復

    雖然在匹配合并時,一般情況下BY變量值至多在某一個數據集中有重復,但并不代表匹配合并只能處理這一種情況,它同樣可以處理兩個或兩個以上輸入數據集中的BY變量值重復的情況,也就是實現多對多合并。SAS的匹配原則和一對多合并時一樣,并且新數據集中每一個 BY變量值重復的次數和輸入數據集中重復次數最多的一樣。

    運用MERGE語句進行多對多合并在實際應用中并不常見,但是理 解了SAS的匹配原則在實際應用中有助于開發人員進行程序調試和質量 控制。這里用一個簡單的例子幫助讀者理解。

    ?

    data work.schedule; merge work.staff work.time; run; proc print data=work.schedule; run;data work.test1; input x y; datalines; 1 2 1 3 2 2 2 4 ; run; data work.test2; input x z; datalines; 1 4 1 9 2 3 2 9 3 4 ; run; proc sort data= work.test1 out=work.merge1; by x; run; proc sort data=work.test2 out=work.merge2; by x; run; proc print data=work.merge1; run; proc print data=work.merge2; run; data work.merge_all; merge work.merge1 work.merge2; by x; run; proc print data=work.merge_all; run;

    3 使用數據集選項IN=操作觀測

    在上例中,work.staff_personel數據集中有一部分員工沒有業績信息,如果不想將這些員工的信息包含在新生成的數據集中,就需要確定數據集work.staff_personel與work.sales_current_month是否分別輸出了它 們的觀測值到輸出數據集中。使用數據集選項IN=可以幫助實現這一功能。

    數據集選項IN=的基本形式如下:

    數據集(IN= 變量)

    數據集選項IN=可以運用在SET、MERGE、MODIFY、UPDATE語 句中的任何數據集后面。變量是數值型臨時變量,不同的數據集應定義 不同的臨時變量名稱,臨時變量可以在DATA步中使用,但是不會在數 據集中輸出。在某一數據集后面使用(IN=變量)時,如果PDV中對應 的變量值是來自于這一數據集的觀測,臨時變量將被賦值為1,否則臨 時變量的值為0。特別是,當和BY語句一起使用時,可以通過判斷PDV 中BY變量的值是否來自于這一數據集來確定臨時變量的值。

    以下程序對例4.8的數據集進行匹配合并時使用了數據集選項IN=。

    由于選項IN=指定的只是臨時變量,為了在輸出數據集中能看到變量的

    值,因此在程序中又將這些臨時變量的值賦給了新變量INA和INB。從 輸出結果可以看出,在合并以后的數據集中,來自work.staff_personel的 觀測的INA為1,來自sales_current_month的觀測的INB為1。

    data work.Staff_sales; merge work.staff_personel (IN=a) work.sales_current_month (IN=b); by Emp_ID; ina=a; inb=b; run; proc print data=work.Staff_sales noobs; title 'Staff Sales'; run;

    ?

    如果只想將既存在于work.staff_personel又存在于 work.sales_current_month中的員工記錄寫入新數據集中,可以通過IF語 句實現。

    data Staff_sales; merge staff_personel (IN=a) sales_current_month (IN=b); by Emp_ID; if a and b; run;

    其中“if a and b;”是“if a and b then output;”的一種省略形式。

    4. 數據集的更新?

    ?數據集的更新,指的是用一個數據集中的數據來替換另一個數據集 中的數據。SAS提供了UPDATE語句來實現數據集的更新

    UPDATE語句如下:

    DATA WORK.DATA1; UPDATE WORK.DATA1 WORK.DATA2; BY Year; RUN;

    在運用UPDATE語句進行數據集更新時,通常稱DATA1為主數據集,DATA2為更新數據集。在上述示例中,主數據集和更新數據集通 過BY變量Year聯系起來,更新數據集中的非缺失的變量值替換了主數 據集中的變量值。對于更新數據集中存在缺失值的情況,在UPDATE語 句中可以運用選項UPDATEMODE=來控制是否用缺失值替換主數據集 中的變量值,系統默認UPDATEMODE=MISSINGCHECK,也就是不替 換;如果設置UPDATEMODE=NOMISSINGCHECK,則不管更新數據 集中的變量值是否是缺失值,都將替換。

    使用UPDATE語句進行數據集更新的基本形式如下:

    DATA 新數據集; UPDATE 主數據集 更新數據集 <UPDATEMODE = MISSINGCHECK|NOMISSINGCHECK>; BY 變量1 <變量2 變量3 …>; RUN;

    更新后數據集的名稱可以是新的數據集名稱,不需要和主數據集同 名。新數據集中包含主數據集和更新數據集中的所有變量。

    主數據集和更新數據集都必須按照BY變量排序。通常要求BY變量值在主數據集中必須是唯一的,且不需要進行更新,例如BY變量可以 是員工號或交易號。運用UPDATE語句時,如果SAS發現主數據集中BY 變量值有重復,SAS會在日志中輸出警告,此時雖然可更新成功,但是所有的更新只會作用在主數據集中BY組合的第一條觀測上。

    某公司的市場部門將所有的客戶信息都存儲在數據集

    work.Customer中,但是每年都需要對這些客戶信息進行及時更新,更新信息存儲在數據集work.UpdateInfo中。

    以下代碼創建了數據集work.Customer和work.UpdateInfo。 work.Customer和work.UpdateInfo中包含了客戶編號、姓名、地址、聯系 方式等數據。

    data work.Customer; input Customer_ID $1-4 Name $ 6-19 Address $ 21-37 City $ 39-51 State $ 53-54; datalines; C001 Jacob Adams 111 Clancey Court Chapel Hill NC C002 Emily Anderson 1009 Cherry St. York PA C003 Michael Arnold 4 Shepherd St. Vancouver BC C004 Hannah Baker Box 108 Milagro NM ; run; proc print data=work.Customer noobs; title "Customer - Master Data"; run; data work.UpdateInfo; infile datalines missover; input Customer_ID $1-4 Name $ 6-19 Address $ 21-37 City $ 39-51 State $ 53-54 ; datalines; C001 14 Bridge St. San Francisco CA C002 Emily Cooker 42 Rue Marston C002 52 Rue Marston Paris C005 Jimmy Cruze Box 100 Cary NC ; run; proc print data=work.UpdateInfo noobs; title "Update Information - Yearly Transaction Data"; run;

    Customer_ID是客戶的注冊號,對于客戶來說,這個注冊號是唯一的。由于work.Customer和work.UpdateInfo都已經按照 Customer_ID排過序,因此在更新前不需要重新排序。接下來用 UPDATE語句對數據集work.Customer進行更新。示例代碼如下:

    data work.Customer_update; update work.Customer work.UpdateInfo; by Customer_ID; run; proc print data=work.Customer noobs; title "Customer- Master Data Update"; run;

    在上例中,主數據集中的BY變量是唯一的,更新數據集中的BY變 量值存在重復值,我們可以有如下發現:

    • ·當更新數據集中BY變量值存在重復值時,BY組合中的后一條觀測 會覆蓋前一條觀測。例如Customer_ID為C002的更新信息分別記錄在 work.UpdateInfo的兩條觀測中,更新后的數據集中Customer_ID為C002 的觀測是唯一的,并且Address為work.UpdateInfo中后一條觀測的值。
    • ·當更新數據集中的某一條觀測在主數據集沒有對應的觀測時,SAS 會直接將這條觀測作為更新的基礎,然后結合更新數據集中剩余的觀測 繼續處理該觀測。如上例中Customer_ID為C005的觀測在主數據集中不 存在,SAS將其作為了更新的基礎,由于更新數據集中不含有其他 Customer_ID為C005的觀測,所以該條觀測被直接加入新數據集中。

    UPDATE語句和MERGE語句都可以對兩個數據集進行匹配合并,但是存在比較大的區別,如下:

    • ·UPDATE語句只能操作兩個數據集;MERGE語句可以對兩個或兩 個以上數據集進行操作。
    • ·使用UPDATE語句時必須使用BY語句;MERGE語句在不使用BY語句的時候也可以按觀測號進行一對一合并。
    • ·在處理缺失值時,UPDATE語句可以控制是否用缺失值對主數據 集進行替換;MERGE語句中后一數據集中的缺失值一定會覆蓋前一數 據集中的值。
    • ·當BY變量值在后一數據集或者更新數據集中不唯一時,UPDATE 語句和MERGE語句的處理方式不一樣,詳見上一章節中MERGE語句的 多種情形和本節前面部分的介紹。?
    data work.Customer; input Customer_ID $1-4 Name $ 6-19 Address $ 21-37 City $ 39-51 State $ 53-54; datalines; C001 Jacob Adams 111 Clancey Court Chapel Hill NC C002 Emily Anderson 1009 Cherry St. York PA C003 Michael Arnold 4 Shepherd St. Vancouver BC C004 Hannah Baker Box 108 Milagro NM ; run; proc print data=work.Customer noobs; title "Customer - Master Data"; run; data work.UpdateInfo; infile datalines missover; input Customer_ID $1-4 Name $6-19 Address $21-37 City $39-51 State $53-54 ; datalines; C001 14 Bridge St. San Francisco CA C002 Emily Cooker 42 Rue Marston C002 52 Rue Marston Paris C005 Jimmy Cruze Box 100 Cary NC ; run; proc print data=work.UpdateInfo noobs; title "Update Information-Yearly Transaction Data"; run;data work.Customer_update; update work.Customer work.UpdateInfo; by Customer_ID; run; proc print data=work.Customer noobs; title "Customer- Master Data Update"; run;

    5. 數據集的更改

    SAS提供了MODIFY語句進一步擴充了DATA步的功能,它可以在 原數據集上直接進行替代、刪除或添加觀測的操作。

    5.1 單個數據集的更改

    運用MODIFY語句進行單個數據集更改的基本形式如下:

    DATA 原數據集; MODIFY 原數據集; RUN;

    運用MODIFY語句,可以更改原數據集中任何變量的值,但是由于 該語句不能夠更改原數據集的描述部分,因此不能在原數據集中添加或 者刪除變量。以下通過一個銷售管理系統的例子來講解MODIFY語句的 運用。

    數據集work.inventory中包含產品、庫存和價格的信息,以下代碼創 建了數據集work.inventory。

    data work.inventory; input Product_ID $ Instock Price; datalines; P001R 12 125.00 P003T 34 40.00 P301M 23 500.00 PC02M 12 100.00; proc print data=work.inventory noobs; title "Warehouse Inventory"; run;

    數據集work.inventory內容如圖4.19所示。 例4.11:由于物價上漲導致成本上升,公司決定將每種產品的銷售價格提高15%。 示例代碼如下:

    data work.inventory; modify work.Inventory; price=price*1.15; run; proc print data=work.inventory noobs; title 'Price reflects 15% increase'; run;

    4.4.2 兩個數據集的更改

    使用MODIFY語句可以實現通過一個數據集對另一個數據集中的數 據進行更改,基本形式如下:

    DATA 主數據集; MODIFY 主數據集 修改數據集; BY 變量1 <變量2 變量3 …>; RUN;

    其中,主數據集表示需要更改的數據集,修改數據集中包含了用于更改的數據,此時必須使用BY語句。在使用MODIFY時,主數據集和 修改數據集中的BY變量不需要事先排序或索引,但是按BY變量排序或 索引可以提高運行效率,特別是在觀測量很大的情況下。

    在使用MODIFY更改數據集時,需要注意以下兩點:

    • ·當主數據集中的BY變量值有重復值時,只有每個BY變量值的第一條觀測會被更改;當修改數據集中的BY變量值有重復值時,系統會依次讀入修改數據集中的每一條觀測,并應用到主數據集,且后讀入的觀 測會覆蓋前一次讀入的觀測;當主數據集和修改數據集中的BY變量值都有重復值時,系統會依次操作修改數據集中BY組合中的每一條觀測,并且應用到主數據集中對應BY組合的第一條觀測中。
    • ·如果在修改數據集中存在缺失值,系統默認不用缺失值更改主數據集中的數據。如果需要用缺失值更改主數據集,可以仿照在UPDATE 語句中使用選項UPDATEMODE=實現操作。

    實際上,在主數據集或修改數據集中BY變量值有重復值時,MODIFY語句的處理邏輯和UPDATE語句一樣。

    例4.12:接著例4.11繼續操作,數據集work.inventory2中保存了公司 產品在海外倉庫的庫存信息,現在公司財務欲根據work.inventory和 work.inventory2中的數據計算公司各產品的總庫存,并制作報告。

    以下代碼創建數據集work.inventory2。

    data work.inventory2; input Product_ID $ Outstock ; datalines; P001R 12 P001R 30 P001R 25 P003T 34 P301M 23 ; proc print data=work.inventory noobs; title "Warehouse Inventory Inhouse"; run; proc print data=work.inventory2 noobs; title 'Warehouse Inventory Overseas'; run;

    兩個數據集work.inventory和work.inventory2的內容如圖4.21所示。 需要注意的是,在work.inventory2中,產品P001R有三條觀測。 計算各產品總庫存的程序如下:

    data work.inventory; modify work.inventory work.inventory2; by product_id; instock=instock+Outstock; run; proc print data=work.inventory noobs; title 'Total Inventory'; run;

    程序中加入“instock=instock+Outstock;”用來計算instock并輸出到數據集work.inventory中,產品P001R的instock的值等于原work.inventory 數據集中P001R的instock值加上work.inventory2中P001R的3條觀測的 instock值。

    以上例子中,修改數據集中的所有觀測在主數據集中都可以找到對 應的觀測,當修改數據集中含有一些新觀測時,可以使用OUTPUT語句 將新觀測添加到主數據集中,具體使用方法請查詢SAS幫助文檔。

    6.? 數據集處理的一點補充

    1 使用數據集選項END=

    很多情況下,在進行數據操作時需要知道SAS在什么時候處理輸入 數據集的最后一條觀測,這時可以使用SAS提供的數據集選項END=來 幫助辨識。使用數據集選項END=的基本形式如下:

    SET 數據集1 <數據集2 數據集3… >END=變量;

    在使用SET、MERGE、MODIFY、UPDATE語句時,都可以使用該 選項。這里語句中的變量是數值型的臨時變量,當DATA步在操作數據 集的最后一條觀測時,該變量的取值為1,否則為0。臨時變量可以在 DATA步中使用,但是不會在數據集中輸出。需要特別注意的是,在使 用SET、MERGE、MODIFY、UPDATE語句進行多個數據集處理時,只有當DATA步處理所有輸入數據集的最后一條觀測時,該變量的取值才 會由0變成1。?

    數據集work.Sales中記錄了公司每位員工的全年的銷售額, 現在欲計算全年公司的總銷售額,并輸出到報表中。

    以下代碼創建了work.Sales數據集,Emp_ID表示員工編號,Dept表示員工所屬部門,Sales表示銷售額。

    data work.sales; input Emp_ID $ Dept $ Sales Gender$; datalines; ET001 TSG 100 M ED001 DSG 200 F ED001 DSG 135 M EQ001 QSG 234 F ET001 TSG 125 F ET002 TSG 98 M EQ002 QSG 100 M EQ003 QSG 98 M ED002 DSG 124 M ET003 TSG 123 F ; run; proc print data=work.sales; title 'Sales'; run;

    現在運用END=選項計算公司全年的總銷售額。?

    data work.total_sales; set work.sales END=last; total_sales+sales; if last then output; keep total_sales; run; proc print data=work.total_sales noobs; title 'Total Sales in Million';run;

    ?

    上面這段代碼中有以下幾個要點:

    • ·END=last定義了臨時變量last,當SAS在處理最后一條觀測時,last的取值將變為1。
    • ·“total_sales+sales;”計算公司的全年銷售 額。“total_sales+sales;”的作用和“retain total_sales 0; total_sales=total_sales+sales;”一樣。
    • ·IF語句和OUTPUT語句判斷了最后一條觀測,并將該觀測輸出到數據集中。
    • ·KEEP語句僅將需要輸出的total_sales變量保留在數據集中。 上面計算全年銷售額的代碼和下面的代碼等價。
    data work.total_sales; set work.sales END=last; retain total_sales 0; total_sales=total_sales+sales; if last then output; keep total_sales;

    5.2 使用自動變量FIRST.與LAST.

    DATA步中若使用了BY語句,SAS要求讀入的數據集必須按BY 變量排序(MODIFY語句除外),同時,SAS在程序執行過程中會自動 生成兩個數值型臨時變量:FIRST.變量和LAST.變量,它們分別用來辨 識BY組合的第一條觀測和最后一條觀測。當只有一個BY變量時,很容 易理解它的取值。

    ·當DATA步正在處理該BY變量值的第一條觀測時,FIRST.變量為1,否則為0。

    ·當DATA步正在處理該BY變量值的最后一條觀測時,LAST.變量為1,否則為0。

    當有多個BY變量時,系統會自動生成多對FIRST.變量和LAST.變 量。例如,SAS在執行如下代碼時,會自動生成臨時變量FIRST.x和 LAST.x,以及FIRST.y和LAST.y。

    data work.test; input x y $ @@; datalines; 1 A 1 A 1 B 2 B 2 C ; run; data work.try; set work.test; by x y; firstx=first.x; lastx=last.x; firsty=first.y; lasty=last.y; run;

    SAS處理第一條x=1的觀測時,first.x=1;當SAS處理最后一條 x=1的觀測時,last.x=1;當SAS處理第一條x=1并且y=“A”的觀測時, first.y=1;當SAS處理最后一條x=1并且y=“A”的觀測時,last.y=1。?

    據集work.Sales中包含了每位員工的銷售額和員工所屬部

    門及性別數據,現在公司欲統計各部門男員工和女員工的總銷售額,并 制成報表。

    首先將work.Sales數據集按Dept和Gender進行排序,然后再運用選 項FIRST.與LAST.計算各部門男女員工的總銷售額。

    proc sort data=work.sales; by Dept Gender; run; data work.sales_dept; set work.sales; by Dept Gender; retain sales_by_dept; if first.Gender then sales_by_dept=0; sales_by_dept=sales_by_dept+sales; if last.Gender; keep Dept Gender sales_by_dept; run; proc print data=work.sales_dept noobs; title 'Sales by Department by Gender'; run;

    “if last.gender;”是“if last.gender then output;”的省略寫法。這里使用了RETAIN語句,使得在DATA步的循環中sales_by_dept的值可以保留 在PDV中。BY語句創建的這兩個臨時變量不僅可在SET語句讀入單個數據集時 使用,在進行多個數據集的拼接時也常使用。

    ?

    5.3 使用SET語句中的選項POINT=和NOBS=

    DATA步使用SET語句讀入數據集時,可使用選項POINT=指明要 讀入的觀測序號。使用選項POINT=的基本語法如下:

    SET 數據集POINT=指針變量;

    其中指針變量用來指明要讀入特定序號的觀測,必須在SET語句執 行前對它賦值。在有SET語句的DATA步程序中,系統將反復執行 DATA步的語句,直到遇到數據中的文件結束標志。但是在使用選項 POINT=時,系統會直接讀入指針指向的記錄,這就很可能導致系統不 會遇到文件結束標志,容易陷入死循環。因而在按指針讀入數據的程序 中,經常會用到STOP語句。

    如果要取得數據集中觀測的個數,可以使用SET語句中的選項

    NOBS=,語法如下:

    NOBS=變量;

    其中,變量同樣是臨時變量,在DATA步的編譯階段賦值。

    4.15:現有一個數據集work.Whole,欲從其中隨機抽取1/3的觀測

    用來建立模型。

    示例代碼如下:

    data? work.sample;

    do?? i=1? to? total? by?? 3;

    set? work.whole? point=i? nobs=total;

    output;

    end;

    stop;

    run;

    運行這個代碼,系統將從數據集work.sample中依次抽出第1條觀 測、第4條觀測…,并存儲到數據集work.sample,直到系統處理完數據 集中的全部觀測。

    5.4 使用多個SET語句

    SAS中實現同一個操作,往往可以有多種方法。作為補充,這里 將介紹如何運用SET語句進行數據集橫向合并。使用SET進行橫向合并 的一個好處是,在合并之前不需要將輸入數據集進行排序。

    下是使用多個SET語句的一個簡單例子。

    data work.data1; input x y @@; datalines; 1 2 2 3 3 4 ; run; data work.data2; input x z @@; datalines; 1 3 3 5 4 2 5 4 ; run; data work.combined; set work.data1; set work.data2; run; proc print data=work.Combined; title 'Using Two Set in Data Step'; run;

    數據集work.data1和數據集work.data2的內容如所示。 合并后的數據集work.combined如圖所示。

    ?

    ?

    ?

    在使用多個SET語句時,PDV中的變量是讀入數據集的并集。首 先,DATA步從第一個SET語句中讀入第一條觀測,并復制到PDV中; 然后從第二個SET語句中讀入第一條觀測,并復制到PDV中。當輸入數 據集中有同名變量時,后讀入的數據集的變量值覆蓋前一個數據集中同 名變量的值。新數據集中的觀測數是所有輸入數據集中的觀測數的最小 值,因為當DATA步遇到第一個文件結束標志時,DATA步就結束執 行。

    5.5 使用HASH對象處理多個數據集

    前面部分已經介紹了運用SET語句和MERGE語句進行數據集之間的拼接,這里將通過實例介紹如何運用HASH對象實現這類操作。相較于SET語句和MERGE語句,使用HASH對象有兩個優點,第一,它對數據集的排序沒有要求;第二,由于HASH對象是放入內存中的數據集,因此在內存允許的情況下,運用HASH對象進行數據集之間 的關聯時其效率更高。

    一般在觀測數很多的數據集與觀測數較少的數據集進行匹配時,運用HASH對象將較小的數據集加載到內存中,可以非常快速地完成匹 配。

    接下來首先介紹在DATA步中如何定義HASH對象。

    1.定義HASH對象

    使用HASH對象時,首先要定義HASH對象,基本形式如下:

    DECLARE object HASH對象名(<主題1: 內容1 <, 主題2: 內容2, …>>); HASH對象名.DEFINEKEY(<主題1: 內容1 <, 主題2: 內容2, …>>); HASH對象名.DEFINEDATA(<主題1: 內容1 <, 主題2: 內容2, …>>); HASH對象名.DEFINEDONE();

    這里第一行定義了HASH對象名稱,object可以是HASH或HITER,HASH對象名由編程者定義。

    第二行和第三行分別通過HASH對象名.method的語法定義了HASH對象的KEY變量和DATA變量,這些變量都是DATA步中的變量。 第四行表明HASH對象定義結束。

    現在有一個數據集work.Sales,其中包含了員工編號 Emp_ID、員工部門Dept、銷量Sales、產品編號Product_id,另一個數據 集work.Product中包含了Product_id、Product_name和Description 3個變 量,現在欲將Product_name和Description加到數據集Sales中。

    以下代碼生成Sales和Product中的部分數據。

    data work.sales; input Emp_ID $ Dept $ Sales Product_ID $; datalines; ET001 TSG 100 P001 ED001 DSG 120 P001 ET001 TSG 50 P002 EC001 CSG 230 P004 EQ001 QSG 150 P003 ET001 TSG 210 P004 ET002 TSG 40 P002 ET003 TSG 150 P003 ; run; data work.product; infile datalines dsd; length Product_ID $4 Product_Name Description $35; input Product_ID $ Product_Name $ Description $;
    datalines; P001,ManufacturingIndustry Solutions,ManufacturingIndustry Solutions V2 P002,Logistics Solutions,Logistics Solutions V1 P003,Financial Service Solutions,Financial Service Solutions V3 P004,Insurance Solutions,Insurance Solutions V2 ; run;

    以下是通過HASH對象實現匹配的完整代碼。

    data work.sales_description(drop=ErrorDesc) work.exception; length Product_ID $8 Product_Name Description $35; if _N_=1 then do; /*Define hash objective*/ Declare hash product_desc(dataset:"work.product"); product_desc.definekey('Product_ID'); product_desc.definedata('Product_Name','Description'); product_desc.definedone(); call missing(Product_ID,Product_Name,Description); end; set work.sales; /*Retrieve matching data*/ rc=product_desc.find(); if rc = 0 then output sales_description; else do; ErrorDesc="No Product Description"; output exception; end; drop rc; run;

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/suolilian/p/10552486.html

    總結

    以上是生活随笔為你收集整理的SAS 对数据的拼接与串接的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    av在线影视 | 国产一区在线观看免费 | 国产精品久久久久一区二区 | 丁香五婷 | 黄色1级大片 | 丰满少妇在线观看网站 | 国产精品成人一区二区三区 | 欧美日韩国产在线一区 | 在线v片免费观看视频 | 国产香蕉视频在线播放 | 欧美综合在线观看 | 欧美性另类| 成人看片 | av电影免费在线播放 | 人交video另类hd | 久久精品成人热国产成 | 亚洲国产精品成人精品 | 91麻豆看国产在线紧急地址 | 国产精品久久久久久久婷婷 | 就要干b| 四虎永久精品在线 | 亚洲精品国产视频 | 玖玖精品视频 | 国产精品扒开做爽爽的视频 | 欧美男同视频网站 | 免费涩涩网站 | 国产成人久久精品亚洲 | 欧美日韩一区二区三区不卡 | 亚洲 精品在线视频 | 91精彩在线视频 | 男女精品久久 | 日韩视频在线一区 | 日韩在线观看免费 | 成人不用播放器 | 亚洲在线视频网站 | 国产精品一区二区美女视频免费看 | 天天操综合| 国产精品一区免费在线观看 | 日韩婷婷| 又湿又紧又大又爽a视频国产 | www欧美日韩| 在线视频 亚洲 | 久久久久久久久网站 | 色婷婷婷 | 国产日韩欧美网站 | 97电影手机 | 五月天久久婷婷 | www成人精品 | av中文字幕免费在线观看 | 久久第四色| 日日夜夜天天综合 | 69视频在线 | 国产精品video爽爽爽爽 | 国产美女网站视频 | 六月天综合网 | av在线在线| 99精品久久99久久久久 | 国产毛片aaa| 99成人免费视频 | 在线观看播放av | 国产99黄| 久久五月精品 | 久久久久久看片 | 91高清视频| 激情综合色综合久久 | 成人福利在线观看 | 91av视频在线免费观看 | 免费看黄在线网站 | 黄色三级免费片 | 国产黄a三级 | 久久久久在线观看 | 在线观看免费日韩 | 在线观看蜜桃视频 | 久久久久久国产精品美女 | 中文字幕在线观看一区 | 中文字幕在线观看日本 | 96超碰在线 | 国产精品乱码一区二三区 | 亚洲日本在线一区 | 精品国产电影一区 | 91伊人久久大香线蕉蜜芽人口 | 久草在线播放视频 | 在线精品一区二区 | 韩国一区二区三区在线观看 | 国产午夜精品理论片在线 | 亚洲人在线7777777精品 | 国产精品高 | 亚洲精品美女免费 | 久草www| 久久精品91久久久久久再现 | 成人免费观看在线视频 | 亚洲aⅴ免费在线观看 | 久久99国产精品免费网站 | 一区二区视频免费在线观看 | 黄色成人91 | 91传媒免费观看 | av片免费播放| 91一区二区三区在线观看 | 国产不卡高清 | 国产视频 亚洲视频 | 国产日韩欧美在线观看 | 欧美日韩视频在线一区 | www国产亚洲精品久久麻豆 | 色人久久 | 五月天综合网站 | 91精品国产91久久久久久三级 | 手机av看片 | 超碰人人在 | 日本精品一区二区三区在线观看 | 国产精品手机在线播放 | 国产伦理久久精品久久久久_ | 成人在线免费看 | 视频在线观看亚洲 | 粉嫩一区二区三区粉嫩91 | 免费观看黄色12片一级视频 | 天天操天天摸天天射 | 成人欧美亚洲 | 综合网天天色 | 日韩高清在线观看 | 国产不卡在线播放 | 欧美精品三级在线观看 | 国产精品久久久久久久久毛片 | 日韩精品免费一线在线观看 | 中文字幕一区二区三区在线视频 | 性色大片在线观看 | 精品国产一区二区三区在线 | 日韩欧美国产精品 | 欧美人交a欧美精品 | 高清免费在线视频 | 久草网首页 | 日韩免费看视频 | 国产精品国产三级国产专区53 | 国产色小视频 | 成人免费在线播放视频 | www天天操| 91av播放| 日韩欧美精选 | 麻豆视频免费在线播放 | 久久综合综合久久综合 | 在线免费观看视频a | 在线观看成人毛片 | 美女视频黄免费网站 | 九九99| 亚洲视频综合 | 日韩美av在线 | 成人久久18免费网站图片 | 91免费试看 | 亚洲在线黄色 | 日日躁你夜夜躁你av蜜 | 三级在线视频观看 | 久久久久影视 | 999免费视频 | 亚洲综合色网站 | 尤物97国产精品久久精品国产 | 国产精品99久久免费观看 | 天堂在线成人 | 久久激情网站 | 狠狠操影视 | 一区二区三区电影在线播 | 精品美女国产在线 | 日韩性xxxx | 久久精品麻豆 | av在线在线 | 日韩 精品 一区 国产 麻豆 | 国产一区二区久久久久 | 欧美一级片免费 | av福利网址导航大全 | 日韩在线观看网站 | 久久久久久久久久久久av | 久久99精品国产 | 精品美女久久久久久免费 | 天天干天天操天天搞 | 日日日日干 | 99久久精品一区二区成人 | av高清在线观看 | 99久久精品免费看国产一区二区三区 | 国产 亚洲 欧美 在线 | 欧美疯狂性受xxxxx另类 | 亚洲 中文字幕av | 五月婷婷操| 国产精品久久久久久久久久久久午夜片 | 国产精品白浆视频 | 伊人狠狠色 | 欧美精品免费在线 | 色香天天 | 国产天天爽 | 久久综合精品国产一区二区三区 | 久精品视频免费观看2 | 久草在线高清视频 | 成人在线观看免费视频 | 免费看污网站 | 91精品在线免费视频 | 韩国一区二区在线观看 | 在线亚洲人成电影网站色www | 国产一区欧美一区 | 欧美精品一区二区性色 | 手机在线看a | 日韩在线观看你懂的 | 色噜噜狠狠狠狠色综合 | 亚洲欧洲日韩在线观看 | 国产精品久久久久久婷婷天堂 | 成人毛片一区二区三区 | 中文字幕黄色av | 三级性生活视频 | 在线观看国产 | 日日夜夜综合 | 成人小视频在线 | 亚洲成人黄色av | 国产精品99久久久久的智能播放 | 国模视频一区二区三区 | 日韩视频一区二区在线 | 欧美日韩高清国产 | 99视频这里只有 | 91传媒激情理伦片 | 超碰人人超 | 黄视频网站大全 | 久久久久久久久久久久久久电影 | 狠狠色丁婷婷日日 | 久久久久久99精品 | 欧美日韩国产三级 | 日韩欧美视频免费看 | 国产精品乱码久久 | 黄色性av | 免费久久99精品国产婷婷六月 | 日韩免费高清在线 | 久久99中文字幕 | www.国产精品 | 日韩精品视频免费看 | 久久视频在线观看中文字幕 | 天天操天天操天天操天天 | 在线99| 一区二区视频在线观看免费 | 久久96国产精品久久99漫画 | 麻豆视频一区二区 | 欧美一级艳片视频免费观看 | av中文字幕在线电影 | 在线观看深夜视频 | 97香蕉久久超级碰碰高清版 | 久久国产精品一国产精品 | 色久天 | 免费在线观看91 | 日韩免费av片 | 99视频精品全部免费 在线 | 三级av免费 | 久久99国产综合精品 | 国产成人久久av977小说 | 狠狠色丁香久久婷婷综 | 99草在线视频 | 国产 一区二区三区 在线 | 一区二区三区四区在线 | 亚洲精品国产精品久久99热 | 最近中文国产在线视频 | 97视频免费观看2区 亚洲视屏 | 91九色视频| 综合色伊人 | av一区二区三区在线 | av中文字幕在线播放 | 欧美激情精品久久久久 | 国产精品久久久一区二区三区网站 | 日韩av一卡二卡三卡 | 久久久久国产一区二区三区四区 | 国产精品系列在线观看 | 国产精品剧情 | av电影免费在线看 | 久久国产免费视频 | 久久久久久久精 | 亚洲乱亚洲乱亚洲 | 欧美日韩视频免费看 | 视频福利在线 | 人人狠狠综合久久亚洲婷 | 欧美一级电影免费观看 | 久草在线视频网 | 日韩欧美久久 | 一区二区三区观看 | 久久 在线 | 日日草av| 色六月婷婷| 日本中文字幕视频 | 国产精品一区久久久久 | 国内精品久久久久久久97牛牛 | 日韩性xxx | 国产电影一区二区三区四区 | а中文在线天堂 | 最近免费中文字幕大全高清10 | 日韩av高潮 | av丝袜在线 | 中文字幕高清av | 又黄又爽免费视频 | 精品99久久久久久 | 丁香婷婷综合激情 | 国产亚洲精品久久久久久久久久 | 日韩激情片在线观看 | 成人一区不卡 | 亚洲在线精品视频 | 日本h在线播放 | 日日操狠狠干 | 日本黄网站 | 五月婷婷欧美 | 最新色站 | 色多多在线观看 | 亚洲人人av | 日韩av电影中文字幕在线观看 | 免费在线日韩 | 超碰人人av | 日韩高清www | 婷婷综合网 | 中文字幕在线国产精品 | 成年人在线免费看 | 久久久久久中文字幕 | 久久精品精品电影网 | 色夜视频 | 国产精品一区二区美女视频免费看 | 丁香五月亚洲综合在线 | 亚洲精品午夜视频 | av黄色在线观看 | 中文字幕在线播放一区 | 亚洲经典视频 | 麻豆视频国产 | 欧美一级性视频 | 国产探花视频在线播放 | 98超碰在线 | 999成人免费视频 | 91av视频在线免费观看 | 黄色a级片在线观看 | 久草在线在线精品观看 | 欧洲av在线| 精品国产伦一区二区三区观看体验 | 亚洲黄色一级电影 | 日韩视频免费 | 欧美日韩1区 | 91在线免费观看国产 | 亚洲日本韩国一区二区 | 天天色官网 | 激情综合网五月激情 | 成人欧美在线 | 一本色道久久综合亚洲二区三区 | 国产999精品久久久 免费a网站 | 毛片1000部免费看 | 一区精品久久 | 国产精品扒开做爽爽的视频 | 亚洲伊人天堂 | 玖玖在线资源 | 欧美日韩另类在线观看 | 中国一级片在线观看 | 久久久激情视频 | 在线视频 亚洲 | 粉嫩aⅴ一区二区三区 | 久久国产精品视频 | 深夜免费小视频 | 99国产免费网址 | 91插插插网站 | 天天色视频 | 91亚洲视频在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 欧美日韩首页 | 欧洲色吧 | 九九九九精品九九九九 | 国产一区免费看 | 欧美日韩国产精品爽爽 | 全久久久久久久久久久电影 | 成人综合婷婷国产精品久久免费 | 日韩在线观看你懂的 | 欧美色久| 午夜精品久久久久久 | 久久久激情网 | 美女网站在线看 | 免费在线播放 | 综合影视 | 久久99精品国产麻豆婷婷 | 免费在线观看一区二区三区 | av在线免费播放网站 | 在线观看黄色的网站 | 一区二区精品在线 | 最近中文字幕在线中文高清版 | 日本成址在线观看 | 中文在线免费观看 | 天天射网站 | 免费成视频 | 日本黄色免费在线 | 中文日韩在线 | 亚洲一区二区三区精品在线观看 | 欧洲精品一区二区 | 国产亚洲一级高清 | 黄色大片av| 日本精品视频网站 | 99在线热播 | 国内亚洲精品 | 97人人澡人人添人人爽超碰 | 日韩欧美精品一区 | 日日夜夜天天久久 | 日韩一级电影网站 | 国产伦理久久精品久久久久_ | 樱空桃av | 9999在线视频| 四虎国产精品免费观看视频优播 | 久久婷婷一区 | 亚洲综合欧美精品电影 | 久草在线久草在线2 | 少妇性bbb搡bbb爽爽爽欧美 | 国产一级在线观看视频 | 国产色黄网站 | 国产99精品 | 青草视频在线 | av免费在线免费观看 | 最近乱久中文字幕 | 婷婷黄色片 | 成年人三级网站 | 日韩午夜高清 | 精品日韩在线 | 91成人欧美| 深夜免费福利在线 | 91.dizhi永久地址最新 | 日本视频高清 | 亚洲精品一区中文字幕乱码 | 欧美日韩xxxxx | 精品福利网 | 国产精品久久久久久久久搜平片 | 国产成人免费高清 | 中文永久免费观看 | 久久亚洲精品电影 | 日韩亚洲在线观看 | 色欧美88888久久久久久影院 | 国产乱对白刺激视频在线观看女王 | 亚洲视频精品 | 天天曰视频 | 日日夜夜网站 | 亚洲国产资源 | 国产精品入口a级 | 久久9999久久 | 欧美在线你懂的 | 99精品视频播放 | 色欲综合视频天天天 | 久久99国产精品自在自在app | 午夜少妇一区二区三区 | 日韩在线小视频 | 免费高清在线观看成人 | 97**国产露脸精品国产 | av韩国在线 | 麻豆精品视频 | 特级毛片爽www免费版 | 久久在线电影 | 91最新网址在线观看 | 午夜视频免费播放 | 欧美日韩不卡在线 | 久久午夜网 | 黄色性av | 三级视频国产 | 欧美a视频| 亚洲精品一区二区在线观看 | 久久久久久高潮国产精品视 | 手机在线视频福利 | 在线精品亚洲 | 少妇高潮流白浆在线观看 | 亚洲精品伦理在线 | 精品久久久久久国产偷窥 | 99久久国产免费看 | 国产成人61精品免费看片 | 开心激情网五月天 | 国产一级免费片 | 久亚洲 | 欧美不卡视频在线 | 国产精品久久久久久久久久了 | 91麻豆操| 中文字幕在线第一页 | 欧美日本啪啪无遮挡网站 | 麻豆视传媒官网免费观看 | 黄色官网在线观看 | 日韩欧美69 | 欧美午夜久久久 | 国产精品久久久久久久久久了 | 中文字幕 国产视频 | 亚洲精品乱码久久久久久蜜桃动漫 | 久久久久一区二区三区 | 国产一级久久 | 日韩一区正在播放 | 国内精品视频在线播放 | 国产成人一区二 | 久久精品视频在线观看免费 | 亚洲japanese制服美女 | 久久成人资源 | 国产精品欧美久久久久无广告 | 在线观看爱爱视频 | 国产精品久久久久一区二区三区 | av午夜电影 | 日韩中文字幕在线看 | 欧美一区中文字幕 | 精品国产乱码久久 | av黄网站| 久久图| 97在线观看视频 | 91av在线电影 | 久久成人高清 | 精品久久久久久国产 | 色综合久 | 我爱av激情网| 在线观看黄污 | 怡红院av久久久久久久 | 久久精品艹 | 综合五月 | 久久精品久久国产 | 日韩一区二区三区观看 | 久久超碰97| 97超碰色 | 在线国产精品视频 | 免费的黄色av | 97品白浆高清久久久久久 | 91在线观看黄 | 天天操人| 婷婷六月丁| 久久婷婷视频 | 精品久久精品久久 | 爱情影院aqdy鲁丝片二区 | 国产精品12 | 一区二区三区四区精品 | 激情文学综合丁香 | 国产精品第一视频 | 精品夜夜嗨av一区二区三区 | 色综合婷婷 | 久久这里只有精品视频99 | 特黄特黄的视频 | av电影免费 | 808电影免费观看三年 | 国产精品99久久久精品 | 久久影院亚洲 | 久久精品一级片 | 午夜精品久久久久久久久久久 | 久久一区二区三区国产精品 | 成人a视频片观看免费 | 国内成人精品2018免费看 | 久久69av| 91亚洲影院| 九九热在线精品视频 | av在线电影网站 | 国产理论片在线观看 | 亚洲人人av | 91丨九色丨蝌蚪丨老版 | 欧美精品一级视频 | 99精品国产在热久久下载 | 天天干,天天草 | 美女福利视频一区二区 | 日韩av高清在线观看 | 久草精品视频在线观看 | 人人干网| 日韩二区三区在线观看 | 二区视频在线观看 | 亚洲日本在线视频观看 | 免费视频久久久久 | 91亚洲激情 | 欧美a影视 | 婷婷丁香色 | 国产精品日韩 | 九九综合九九 | 亚洲精品在线视频网站 | av888av.com| 丁香六月婷 | 91在线超碰| 国产精品免费久久久久久久久久中文 | 亚洲人成人99网站 | 综合在线亚洲 | 欧美黄色成人 | 五月婷社区 | 最近中文字幕国语免费av | 日韩91在线 | 人人看人人草 | 人人舔人人爱 | 丁香婷婷色月天 | 欧美91精品国产自产 | 国产免费xvideos视频入口 | 成人午夜毛片 | 亚洲aⅴ乱码精品成人区 | 国产中文在线字幕 | 国产精品国产毛片 | 在线99 | www.久久com| 黄色免费在线视频 | 久久婷综合 | 国内精品久久影院 | 久久久一本精品99久久精品 | 人人澡超碰碰97碰碰碰软件 | 国产色资源 | 毛片网站在线看 | 国产精品永久在线 | 在线观看视频中文字幕 | 久久免费美女视频 | 国产一区二区三区视频在线 | 韩日av一区二区 | 精品国内自产拍在线观看视频 | 中文字幕在线看视频 | 欧美综合在线视频 | 成年人看片网站 | 久久久综合九色合综国产精品 | 午夜精品久久久99热福利 | 91黄视频在线 | 热精品| 国产xxxx性hd极品 | 麻豆91精品91久久久 | 96精品高清视频在线观看软件特色 | 国产精品久久久久久久久久直播 | 久久夜色精品国产欧美乱 | 国产成人免费av电影 | 色噜噜日韩精品欧美一区二区 | 久久婷婷精品视频 | 免费日韩视 | 综合网伊人 | 伊人天堂av | 国产福利精品视频 | 丁香免费视频 | 国产亚洲精品久久 | 成人作爱视频 | 日韩视频在线播放 | 香蕉视频久久久 | 午夜精品一区二区三区在线视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久久久区 | 婷婷色中文网 | 五月婷婷丁香综合 | 国内精品久久久精品电影院 | 国产第一页在线观看 | 成人午夜电影免费在线观看 | 日韩理论影院 | 国内免费的中文字幕 | 久久久性| 久久免费电影网 | 国产精品久久久久999 | 亚洲婷婷免费 | 久久新视频 | www.色国产 | 婷婷久操| 一区二区三区四区精品视频 | 香蕉久久久久 | 在线免费观看麻豆视频 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 玖玖在线观看视频 | 91成年视频 | 久久国产精品免费观看 | 天天夜夜操 | 日韩欧美国产精品 | 最近免费观看的电影完整版 | 国产成人精品女人久久久 | 高清av免费观看 | 国产综合小视频 | 色婷婷亚洲 | 国产免费一区二区三区最新6 | 精品视频久久久 | 色欧美成人精品a∨在线观看 | 欧美日产一区 | 五月婷婷六月综合 | 91av精品| 91久久精品日日躁夜夜躁国产 | 国产高清视频免费最新在线 | 久久精品国亚洲 | 超级碰99| 国产精品久久久免费 | 午夜视频在线观看一区 | 五月婷网站| 香蕉在线观看视频 | 久久精品国产免费看久久精品 | 黄色一级大片在线免费看产 | 久久精品欧美一区二区三区麻豆 | 日韩在线观看你懂的 | 中文在线字幕观看电影 | 在线免费观看视频一区二区三区 | 色婷婷五 | 91精品蜜桃 | 日韩中文字幕免费电影 | 中文字幕免费久久 | 中文字幕永久在线 | 精品国自产在线观看 | 国产精品青草综合久久久久99 | 日韩欧美99 | 在线观看中文字幕视频 | 超碰97在线资源 | 日本精品中文字幕在线观看 | av网站在线观看免费 | 欧美精品久久久久久久免费 | 91色九色| 成人 亚洲 欧美 | 黄色片软件网站 | 久草网在线观看 | 色99视频| 日韩中字在线 | 一区二区中文字幕在线观看 | 欧美日韩免费一区二区 | 六月色婷| 国产精品视频你懂的 | 成人黄色免费观看 | 久久国产精品一区二区 | 国产免费久久久久 | 91高清视频| 二区三区毛片 | 精品一区二区久久久久久久网站 | av免费电影在线 | 亚洲午夜av电影 | 免费看日韩 | 少妇搡bbbb搡bbb搡忠贞 | 操久在线| 日韩免费在线观看视频 | 久久99免费观看 | 在线观看亚洲成人 | 一二三四精品 | 激情婷婷六月 | 2023av在线 | www黄com| 韩国av一区二区三区 | 日韩艹| 久久免费精品视频 | 99视频免费在线观看 | 婷婷六月丁香激情 | 免费进去里的视频 | 免费开视频 | 热re99久久精品国产99热 | 成人午夜在线观看 | 97免费视频在线 | 黄色的视频网站 | 91精品视频一区 | 亚洲热久久 | 日本丰满少妇免费一区 | 国产精品99久久久久 | 91精品视频在线免费观看 | 在线免费观看一区二区三区 | 91精品国产麻豆 | 免费黄色网止 | 久久精品久久国产 | 国产一级片久久 | 91九色九色 | 国产午夜精品免费一区二区三区视频 | 久久高清av | 久草在线免费看视频 | 97视频免费在线看 | 天天操天天干天天插 | 一区二区三区在线播放 | 国产性xxxx| 亚洲精品国产日韩 | 三级免费黄 | 狠狠婷婷 | 中文字幕欲求不满 | 国产精品成久久久久三级 | 亚洲精品免费在线 | 色综合夜色一区 | 久久成人人人人精品欧 | 九色精品免费永久在线 | 永久黄网站色视频免费观看w | 国产视 | 国产精品免费大片视频 | 麻豆国产在线播放 | 五月天激情视频 | 免费观看视频黄 | 国产精品一区二区在线观看 | 激情文学综合丁香 | 久久精品站 | 日韩在线免费电影 | 9ⅰ精品久久久久久久久中文字幕 | 992tv人人草 黄色国产区 | 欧美国产日韩激情 | 992tv在线 | 日韩中文字幕国产 | 福利视频网站 | 三级视频国产 | 亚洲日b视频| 亚洲天天在线 | 精品产品国产在线不卡 | 国产精品中文字幕在线播放 | 成人黄色在线 | 国产伦理精品一区二区 | 九九热在线精品 | 国产成人久久精品77777 | 国产精品aⅴ | 成人高清在线观看 | 欧美日韩大片在线观看 | 日本久久不卡视频 | 久久激情视频 久久 | 国产精品网红直播 | 免费a视频| 五月天婷婷免费视频 | 麻豆 videos | 精品国产乱码久久久久久三级人 | 日日干干 | 国产中文在线观看 | 久久成人国产精品免费软件 | 久久国产亚洲视频 | 天天射狠狠干 | 欧美性网站 | 99久久精品国| 亚洲成人动漫在线观看 | 亚洲一区二区高潮无套美女 | 国产看片 色 | 色偷偷网站视频 | 91精品国产99久久久久久久 | 国产一区二区三区在线免费观看 | av在线a | 亚洲午夜精品福利 | 人人干人人爽 | 91亚洲精品在线观看 | 麻豆91精品视频 | 国产在线精品观看 | 日韩伦理一区二区三区av在线 | 国产精品成人久久久久久久 | 日韩深夜在线观看 | 中文字幕av网站 | 丁香婷婷综合激情 | 国产一区视频在线观看免费 | 国产在线a| 成人免费大片黄在线播放 | 91看片淫黄大片在线播放 | 伊人天天狠天天添日日拍 | 久久久久久蜜av免费网站 | 超碰人在线 | www视频免费在线观看 | 日韩电影一区二区在线观看 | 国产精品免费观看网站 | 99爱这里只有精品 | av先锋影音少妇 | 精品中文字幕在线观看 | 欧美一区二区在线免费看 | 国产在线观看免费观看 | 亚洲精品18p | 欧美午夜性生活 | 国产欧美精品在线观看 | 人人爽人人爽人人 | 日韩r级在线 | 国产精品一区欧美 | 久热色超碰| 欧美视频日韩 | 欧美性生爱 | 中文字幕 二区 | 免费久久99精品国产 | 麻花天美星空视频 | 国产人成精品一区二区三 | 欧美性生活大片 | 一区二区中文字幕在线观看 | 成人av免费看 | 亚洲精品国产精品国自产在线 | 一区二区三区播放 | 日本一区二区三区免费看 | 国产一级精品在线观看 | 久久久国产精品视频 | 激情六月婷婷久久 | 国产黄网站在线观看 | 亚洲综合激情 | 日韩一区二区三区观看 | 91在线看免费 | 婷婷日| 久久国产精品视频免费看 | 日本最大色倩网站www | 午夜 免费 | 日韩视频在线观看视频 | 日本亚洲国产 | 96国产精品 | 天天狠狠| 9草在线 | 91精品国自产在线 | 国产麻豆精品久久一二三 | 免费黄色av片 | 四虎成人在线 | av免费看av| 国产在线a不卡 | 黄色录像av | 欧美黄色软件 | 天天艹天天干天天 | 97精品超碰一区二区三区 | 中文字幕 国产视频 | 久久久久成人精品免费播放动漫 | av一级二级| 四虎成人精品 | 91日韩精品视频 | 懂色av一区二区在线播放 | 久久99精品久久久久久秒播蜜臀 | 亚洲成a人片在线www | 视频国产区 | 制服丝袜欧美 | 久久精品国产免费观看 | 手机在线视频福利 | 欧美日一级片 | 亚洲国产大片 | 一区中文字幕在线观看 | 日日干视频| 99久久精品国产亚洲 | 一区三区视频 | 久久久国产99久久国产一 | 亚洲伊人第一页 | 中国精品少妇 | av播放在线| 国产精品久久久久一区二区三区 | 欧美另类交人妖 | 国产 中文 日韩 欧美 | 91精品免费在线观看 | 国产成人资源 | 99热日本| 国产精品视频观看 | 九九在线国产视频 | 婷婷午夜天 | 性日韩欧美在线视频 | 国产又粗又硬又长又爽的视频 | 中文字幕文字幕一区二区 | 91人人射| 成人欧美日韩国产 | 欧美日韩国产一区二区三区在线观看 | 色av男人的天堂免费在线 | 国产91精品高清一区二区三区 | 18久久久久久| 亚洲精品五月 | 国产999精品久久久影片官网 | 国产91精品高清一区二区三区 | 六月婷操 | 国产美女视频 | 五月天丁香亚洲 | 久久精品国产一区二区 | 91久久精品一区二区三区 | 日本性视频 | 久久精品96| 我要看黄色一级片 | 中文字幕av在线不卡 | 中文字幕综合在线 | 西西444www | 国产精品久久久久久久久岛 | 超碰个人在线 | 国产不卡在线视频 | 91免费高清视频 | 综合国产在线观看 | 麻豆传媒电影在线观看 | 欧美一级视频在线观看 | 五月天亚洲激情 | 在线国产中文字幕 | 国产免费三级在线观看 | 伊人天堂av | 免费下载高清毛片 | 狠狠色丁香久久综合网 | 国产精品女教师 | av成人免费在线看 | 久久免费精品 | 99精品视频在线观看视频 | 欧美成人精品欧美一级乱 | 99热这里是精品 | 黄色影院在线免费观看 | 色婷婷午夜 | 成人午夜精品福利免费 | 国产美女被啪进深处喷白浆视频 | 国产又粗又长的视频 | 偷拍福利视频一区二区三区 | 久久精品2 | 亚洲国产成人久久综合 | 欧美成人高清 | 久艹在线播放 | 天天色天天艹 | 97韩国电影 | 怡红院成人在线 | 视频一区视频二区在线观看 | 97视频在线观看播放 | 亚洲精选视频在线 | 日韩精品亚洲专区在线观看 | 久久999久久| 99久热在线精品视频 | 九精品 | 美女免费视频观看网站 | 国产福利一区二区三区视频 | 国产视频在线看 | 超碰在线资源 | 91精品导航 | 日韩高清不卡一区二区三区 | 亚洲黄网址 | 69精品人人人人 | 国产自产在线视频 | 91完整版在线观看 | 免费a级毛片在线看 | av中文字幕亚洲 | 国产精品视频线看 | www.com.日本一级 | 狠狠撸电影 | 在线你懂 | 欧美一级片在线 | 国产精品视频app | 亚洲爽爽网 | 狠狠干美女 | 久久久久女人精品毛片九一 | 黄色aaa级片 | 国产最新在线观看 | 狠狠操狠狠干2017 | 人人插人人插 | 国产99久久精品一区二区300 | 久草在线在线视频 | 亚州国产精品久久久 | 欧美国产日韩一区二区 | www视频在线观看 | 免费av在线网 | 天天天色| 韩国一区二区三区在线观看 | 在线免费看黄网站 | 中文字幕日本在线观看 | 免费看污的网站 | 国产中文在线观看 | 激情综合网在线观看 | 婷婷激情av | 日韩午夜av | 国产二区免费视频 | av线上看 | 亚洲欧美偷拍另类 | 午夜精品久久久久久 | 伊人丁香 |