最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

如果這樣講你還不懂,不如干脆...

2021-09-14 09:24 作者:陸震同學  | 我要投稿

更新補充

在開始今天的文章前,對昨天的這篇文章 Last observation carried forward,我們做一個補充:

隨著經驗和知識的積累,我們后續(xù)會在 生物統(tǒng)計 里針對 imputation 進行更多的介紹。

回到今天的主題,如果大家還有印象的話,前面這篇文章 比較 merge by 與 proc sql 的外連接(一),是還沒有完結的。我原計劃不會用太多的文字應該就可以講清楚,現在看來,并不是這么一回事。還是需要先將二者各自講清楚,再來分析之間的異同點。

基于此,我們今天就要把 merge by 盡量講清楚,如果這樣你還掌握不了,干脆......收藏這篇文章??

merge 的目的

首先,你要弄清楚,你要用它做什么?你一定回答我,橫向合并。為什么橫向合并?因為某個數據集缺少一些變量,我們想用另一個或一些數據集來更新它。僅僅是這樣么?不,當某個數據集中某個變量的取值并不完整時,我們通常會用 SAS 制作一個 shell,將 shell 與原數據集進行 merge,以達到補充取值盡量使其取值完整的目的(在我們這里,我們稱這種操作為 dummy),從這個角度來看,merge 并不是為了增加橫向的 columns,而是增加了縱向的 rows。

所以,再次問你,你要用 merge 來做什么?你應該回答我,為了補充完整的所有變量、所有行。這個說法不知道你熟不熟悉,反正我是熟悉的,因為在這篇文章里 set 縱向合并只需要注意一處,我也同樣提過,set 的作用也是補充完整的所有變量、所有行。那你要問我了,那既然都是所有變量所有行,為什么還要弄兩個,直接一個不就行了么?因為它們的出發(fā)點是不一樣的,盡管最后可能都補充完整的所有變量所有行。

搞清楚了你要用它的目的,我們就可以繼續(xù)往下講它具體的實現邏輯了。

對于 merge 的橫向合并,我們分為兩大類來說明:

不使用 by,merge 對兩個或多個數據集的橫向合并

對于這種不使用 by 的 merge 合并,我們稱它為一對一橫向不匹配合并。邏輯很簡單,沒有 common key varaible(s),我們就無法青雀控制橫向合并的操作邏輯,因而,SAS 采用基于數據集本身固有順序的方式,第一個數據集的第一條觀測橫向合并第二個數據集的第一條觀測,and so on。

具體地,對于編譯階段,SAS 按照 merge 語句中數據集的先后順序,依次讀入各數據集中變量的描述部分,并將各變量置入 PDV(只添加后續(xù)新變量,PDV 中無重復變量);對于執(zhí)行階段,SAS 按照 merge 語句中數據集的先后順序,從第一個數據集中讀入第一條觀測,并復制到 PDV 中,再從第二個數據集中讀入第一條觀測,并復制到 PDV 中,若兩個數據集中有同名變量,后讀入的值將覆蓋掉先讀入的值。如此重復操作,依次處理各個數據集中的各條觀測,直到處理完其中較少行數的數據集,而后,該數據集相對于另一數據集缺少的行所包含的變量,在 PDV 中均被置為缺失值,直到讀入所有變量所有行。

上 code:

這里,我要提醒大家注意的是:注意看 A、B兩個數據集有 common variable --- id,在做不使用 by 的一對一橫向不匹配 merge 合并時,對于兩個數據集的同名變量,后讀入的變量的值講覆蓋更新先讀入的值,非同名變量則不受影響,獨自美麗。

使用 by,merge 對兩個或多個數據集的橫向合并

使用 by,從而可以更進一步地控制橫向合并,這種我們稱之為橫向匹配合并,也是我們在 programming 中最常遇到的情況。對于橫向匹配合并,需要分別考慮三種情況,我們一一來看:

1. by 變量值在所有數據集中均只有唯一觀測

什么意思?即,在每個數據集中,每個 by 變量值出現且只出現一次,換句話說,在任一數據集中,每個 by 變量組合都只有一條觀測。

操作邏輯為:對于編譯階段,SAS 按照 merge 語句中數據集的先后順序,依次讀入各數據集中變量的描述部分,并將各變量置入 PDV(只添加后續(xù)新變量,PDV 中無重復變量);對于執(zhí)行階段,SAS 按照各數據集中 by 變量值的第一個值確定排在第一位讀入的 by 組合,再按照 merge 語句中數據集的先后順序,從第一個數據集中讀入第一個 by 組合所屬的觀測,并復制到 PDV 中,再從第二個數據集中讀入同一 by 組合所屬的觀測,并復制到 PDV 中,若兩個數據集中有同名變量,后讀入的值將覆蓋掉先讀入的值。

注意??,若某數據集相對于另一數據集缺少該 by 組合的行觀測,則在 PDV 中,該數據集除 by 組合變量外的所有變量均被置為缺失值,而另一數據集的全部變量則正常讀入。當讀取完所有數據集中第一個 by 組合的行觀測,我們認為完成了一次 data step 的迭代,因而,SAS 將 PDV 中所有變量值都重置為缺失值。如此重復操作,直到讀入所有變量所有行。

2. by 變量值在某一數據集中存在重復觀測

即,在某一數據集中,某個或某些 by 組合存在多條觀測,這種橫向匹配合并,我們稱為一對多合并。

操作邏輯為:對于編譯階段,SAS 按照 merge 語句中數據集的先后順序,依次讀入各數據集中變量的描述部分,并將各變量置入 PDV(只添加后續(xù)新變量,PDV 中無重復變量);對于執(zhí)行階段,SAS 按照各數據集中 by 變量值的第一個值確定排在第一位讀入的 by 組合,再按照 merge 語句中數據集的先后順序,從第一個數據集中讀入第一個 by 組合所屬的第一條觀測,并復制到 PDV 中,再從第二個數據集中讀入同一 by 組合所屬的第一條觀測,并復制到 PDV 中,若兩個數據集中有同名變量,后讀入的值將覆蓋掉先讀入的值。

前面情況中,我們討論了某數據集缺少某 by 組合的處理邏輯,這里同樣適用,即若某數據集相對于另一數據集缺少該 by 組合的行觀測,則在 PDV 中,該數據集除 by 組合變量外的所有變量均被置為缺失值,而另一數據集的全部變量則正常讀入。這里,由于 by 變量值在某一數據集中存在重復觀測,則必然存在某數據集不僅不缺少,反而有多個某 by 組合的觀測,此時 SAS 會怎么處理兩個數據集該 by 組合剩余觀測的橫向匹配合并呢?

當讀取完所有數據集中第一個 by 組合的第一條行觀測,我們認為完成了一次 data step 的迭代,此時,SAS 本應將 PDV 中所有變量值都重置為缺失值,但是由于該 by 組合變量值在某一數據集中存在重復觀測,導致此時,SAS 會 retain 住 PDV 中所有變量的值,直到讀入該 by 組合在兩個數據集中的下一條觀測,PDV 中這些變量的值才會被新的值覆蓋更新(若后續(xù)觀測不能提供變量新的值,則原值將被一直 retain 并寫入輸出數據集),而不再像上面那樣直接全部重置為缺失值。但是注意??,由于 by 變量只在某一數據集中存在重復觀測,在另一或另一些數據集中,其所屬的觀測仍然是唯一的,此時,由于 SAS 的 rule 規(guī)定,每行觀測只會被讀入處理一次,因而,unique by 變量值數據集的那行觀測不會再被重復讀入處理。此時,若合并的兩個數據集除 by 變量外,不存在同名變量,那就很好辦了,unique by 變量值數據集的其余變量的值因為不能得到新值覆蓋更新,則原值會被一直 retain 并寫入輸出數據集,直到 SAS 處理完兩個數據集各自該 by 組合的所有觀測行;而若存在除 by 變量外的同名變量,則后續(xù)該同名變量會被含有重復 by 觀測的數據集中的同名變量提供的新值所覆蓋更新,直到 SAS 處理完兩個數據集各自該 by 組合的所有觀測行。

當 SAS 處理完兩個數據集各自該 by 組合的所有觀測行之后,SAS 此時才將 PDV 中所有變量值都重置為缺失值。如此重復操作,直到讀入所有變量所有行。

這里比較繞,上 code:

這是一個簡單同時又非常典型的例子。我要強調它典型的原因是,因為這里兩個數據集除 by 變量外,既有同名變量,又有不同名變量。

大家應該很好理解,output 的第一行觀測的 class 為 eng,因為 a2 后讀入,自然 eng 覆蓋更新 mth。但讀完各自第一條 by 變量觀測后,SAS 并未直接將 PDV 中所有變量值重置為缺失值,反而是 retain 住所有值,等待該 by 組合的剩余觀測變量值來覆蓋更新。而 class 為同名變量,因而從第二條觀測開始,class 的值被 a1 中 class 的值覆蓋更新, 但是 classno 為 a2 中的非同名變量,它的值由于不能得到數據集 a2 的更新,因而被 SAS 一直 retain 并寫入輸出數據集。

3. by 變量值在多個數據集中存在重復觀測

即,在多個數據集中,某個或某些 by 組合存在多條觀測,這種橫向匹配合并,我們稱為多對多合并。

一般地,這種多對多合并,我們并不建議采用 merge by 來實現。關于這種情況的合并,請期待后續(xù)文章的分析討論。

細節(jié)

那么,講到這里,merge 常用的操作基本已經講完了。但是,仍然要提醒大家注意兩個細節(jié):

  1. 若使用 by,兩個或多個數據集中的 by 變量一定要是相同 name、相同 type、相同 length;

  2. 若使用 by,進行 merge by 前,務必分別將兩個數據集進行 sort 處理。

這篇文章寫得賊累。非常感謝你能看到這里,如果你覺得寫得還不錯的話,求轉發(fā)求關注,我們下篇文章再見???????


如果這樣講你還不懂,不如干脆...的評論 (共 條)

分享到微博請遵守國家法律
山西省| 桂东县| 望城县| 隆昌县| 垫江县| 昌邑市| 浙江省| 扶沟县| 承德县| 文化| 满洲里市| 黔西县| 青田县| 龙里县| 乐山市| 左贡县| 工布江达县| 渭源县| 报价| 泸溪县| 米脂县| 牟定县| 华亭县| 聂荣县| 嘉峪关市| 越西县| 蒙自县| 伊宁市| 郧西县| 正阳县| 宁南县| 海丰县| 平果县| 日土县| 福泉市| 南通市| 苏尼特左旗| 澳门| 龙江县| 盘山县| 上蔡县|