SAS Training 003 - R reshape | SAS transpose
在 R 中,我們稱長(zhǎng)寬數(shù)據(jù)的轉(zhuǎn)置為 reshape,相信很多小伙伴都非常熟悉;而在 SAS 中,對(duì)應(yīng)的操作為 proc transpose。雖然我們也可以利用 data 步來完成(極其地 tedious),但是遠(yuǎn)沒有 proc transpose 來得簡(jiǎn)潔明了。我們這里重點(diǎn)聊 SAS 的 transpose,R 中的操作我們留到 R Training 的推送。
數(shù)據(jù)結(jié)構(gòu)
wide data
t 檢驗(yàn)等等,這么一說,是不是感覺知識(shí)都回來了,不再局限于 wide data 這個(gè)名頭了?
long data / narrow data
是的,wide data 數(shù)據(jù)一般一個(gè)觀測(cè)只有一行數(shù)據(jù),每個(gè)變量有一列。但是,我們也接觸過這樣的數(shù)據(jù):臨床試驗(yàn)中,我們對(duì)受試者進(jìn)行有規(guī)律的訪視,每個(gè) subject 每次 visit,我們都會(huì)記錄生成一行數(shù)據(jù),如此下來,結(jié)束隨訪時(shí),每個(gè) subject 會(huì)擁有多行數(shù)據(jù),且每行里有 cell 會(huì)記錄該行 visit 的日期,我們直接上圖:

這樣的話,對(duì)于 long data 的理解就清晰多了,其對(duì)應(yīng)的 wide data 如下:

顯然,我們經(jīng)常接觸下面的 wide 格式,如果我們想比較兩次 wight 之間變化關(guān)系,應(yīng)用這種格式就方便多了。但是,對(duì)于上面的 long 格式呢,我們?nèi)绻朕D(zhuǎn)成 wide,怎么操作?或者由 wide 轉(zhuǎn)為 long,又如何操作?
proc transpose
首先來介紹 syntax:
PROC TRANSPOSE DATA= Dataset-name OUT= New-dataset-name;
? ?BY variable(s);
? ?ID variable;
? ?VAR variable(s);
RUN;
我們分兩種情況來討論。
long data -> wide data 長(zhǎng)轉(zhuǎn)寬
by 組變量確定新 dataset 的行分類結(jié)構(gòu)(wide 中 row identification variable 需要 by 組 變量唯一確定);
id 變量確定新 dataset 的列分組情況,id 變量的每一種 unique 取值在格式化后將成為轉(zhuǎn)置后新數(shù)據(jù)集的新列變量名。特殊地,若 id statement 含多個(gè)變量,則這些變量取值的 unique 組合將成為新列名。要注意的是,由于 id 變量對(duì)應(yīng)列分組,在新 dataset 的行分類結(jié)構(gòu)已確定之下,id 變量每種取值所對(duì)應(yīng)的需要轉(zhuǎn)置的變量的取值在數(shù)據(jù)集中必須是唯一的;
var 指示需要進(jìn)行轉(zhuǎn)置填充新 dataset 中 cell 的變量,若 var 缺省,默認(rèn)轉(zhuǎn)置全部 numeric variables。轉(zhuǎn)置中,SAS 自動(dòng)創(chuàng)建變量 _name_,它以 var 變量名為取值。
來看 code:
data work.narrow_file2;
? ?infile cards;
? ?length pet_owner $10 pet $4 population 8;
? ?input pet_owner $ pet $ population;
? ?cards;
? ? ? ?Mr.Black dog 2
? ? ? ?Mr.Black cat 1
? ? ? ?Mrs.Brown dog 1
? ? ? ?Mrs.Brown cat 0
? ? ? ?Mrs.Green fish 5
? ? ? ?Mr.White fish 7
? ? ? ?Mr.White dog 1
? ? ? ?Mr.White cat 3
? ?;
? ?
? ?proc print data= work.narrow_file2 noobs;
? ? ? ?title "原 long data";
run;
原數(shù)據(jù)集:

進(jìn)行長(zhǎng)轉(zhuǎn)寬:
proc sort data= work.narrow_file2 out= work.sorted_narrow_file2;
? ?by pet_owner;
run;
proc transpose data= work.sorted_narrow_file2 out= work.narrow_file2_transp_id_by name= column_that_was_transposed;
? ?by pet_owner;
? ?id pet;
? ?var population;
run;
proc print data= work.narrow_file2_transp_id_by noobs;
? ?title "新 wide data";
run;

看看你能不能和原數(shù)據(jù)集對(duì)應(yīng)上。
wide data -> long data 寬轉(zhuǎn)長(zhǎng)
by 組變量確定新 dataset 的行分類結(jié)構(gòu)(long 中單個(gè)觀測(cè)多行數(shù)據(jù),row identification variable 即為 by 組變量,by 組變量在多行間重復(fù));
id 變量確定新 dataset 的列分組情況;
var 中每個(gè)變量將成為新 dataset 中某列變量的每一行。
上 code,將前面轉(zhuǎn)置后的 wide data 轉(zhuǎn)回去:
proc transpose data= work.narrow_file2_transp_id_by out= reverse name= pet;
? ?by pet_owner;
? ?id column_that_was_transposed;
? ?var dog cat fish;
run;
proc print data= reverse noobs;
? ?title "轉(zhuǎn)回 long data";
run;
