2010-04-19 344 views
8

在SAS 9中,我怎樣才能在簡單的數據步驟中重新排列順序字段。SAS:在數據步驟中重新排列字段順序

Data set2; 
    /*Something probably goes here*/ 
    set set1; 
run; 

因此,如果設置1具有以下字段:

Name Title Salary 
A  Chief 40000 
B  Chief 45000 

然後我可以改變SET2領域爲:

Title Salary Name 
Chief 40000 A 
Chief 45000 B 

感謝,

+1

您可以加入多一點關於你爲什麼要這麼做的信息?如果它的格式化/打印,我認爲你可以處理與proc打印... – mcpeterson 2010-04-19 20:39:21

回答

5

如果你在你的數據集非常大量的變量有時更容易使用SQL語句,而不是datastep的。這允許您只列出您關心的順序的變量,並使用通配符保留其他所有內容。

proc sql noprint; 
    create table set2 as 
    select title, salary, * 
    from set1; 
quit; 

如果您正在使用大型表這樣做,你可以通過創建一個視圖,而不是保存自己的IO開銷。這可以應用於數據集方法或proc sql方法。

proc sql noprint; 
    create view set2 as 
    select title, * 
    from set1; 
quit; 

** OR; 

data set2/view=set2; 
    retain title salary name; 
    set set1; 
run; 

乾杯 羅布

+1

只需要清楚,@ mcpeterson提供的鏈接中列出的所有方法也具有您對PROC SQL的屬性 - 一個不需要指定數據集中所有變量的排序,僅限那些感興趣的變量。其餘的仍然保留(除非另有規定)。 – user667489 2012-03-03 20:14:40

3

您也可以使用了信息語句來做到這一點 - 沒有必要指定任何informats。我認爲這比等效的保留語句稍微有效一些,因爲它允許SAS初始化值丟失而不是從前一行中檢索它們。實際上,差異很小,並且您也可以選擇使用視圖。

data set2; 
    informat title salary name; 
    set set1; 
run; 

在了信息語句中指定的變量被移動到數據集的左側,成訂單,其餘的都留下,因爲他們是在輸入數據集。

+0

只要保留vs不保留,SAS不會像您認爲的那樣工作。 RETAIN不從前一行檢索值;它實際上會導致SAS沒有在迭代之間設置一個變量,所以如果這個和informat解決方案的工作方式有所不同,它會更快,而不是更慢。我懷疑這兩者之間沒有差別,因爲SAS在兩種情況下都會做同樣的事情(在PDV中定義變量並停止)。 – Joe 2014-08-05 21:32:36

+0

是的,我弄錯了。然而,我認爲信息與保留仍然是一個例子,因爲前者不太可能導致任何意想不到的行爲,例如,如果源數據集包含缺失值。 – user667489 2014-08-05 22:19:57

+0

我會暫時同意你的意見,等待我記住爲什麼幾乎沒有人用這種方式使用'informat'(或'format'),幾乎每個人都使用'retain',儘管可能會產生意想不到的後果...... – Joe 2014-08-05 22:21:04

0

個人來說,我使用attrib語句 - 如下:

data set2; 
    attrib title salary name label=''; 
    set set1; 
run; 

挺像了信息的方法,但(可能更需要需要比了信息標籤)