在考慮我的職業生涯時,我是JMP的新手。事實上,我的JMP和JSL(JMP腳本語言)經歷始於我大約四年前成為JMP生命科學小組的開發人員。 相比之下,我一直在使用SAS,因為我是數學的本科生,給了我20多年的經驗。 雖然這兩種語言之間存在很多差異,但我最喜歡的工作之一就是使用這個非常龐大而豐富的工具集來開發很酷的新功能 JMP臨床 。
即使我可以訪問這兩個 JMP 和 SAS ,我有時會發現自己想知道如何使用JSL在SAS中復制一個功能。本博文的主題是如何復制SAS數據步驟行為以按組選擇第一個和最後一個記錄。 在SAS中,首先對數據進行排序並在數據步驟中使用特殊關鍵字來執行此操作。 例如,如果我使用SAS格式化的Big Class數據表並希望按字母順序選擇第一個男孩和女孩,則下面的程序將實現此目的:
proc sort data = bigclass;
按性別名稱;
跑;
數據優先;
設置大類;
按性別名稱;
如果first.sex;
跑;
按字母順序選擇最後一個男孩和女孩,我會用如果last.sex; 。 如果我想在組中選擇第一個和最後一個,則類似的邏輯適用。 說,我想為性別中的每個名字選擇最短的人,以下是這樣做的:
proc sort data = bigclass;
按性別名稱身高;
跑;
數據優先;
設置大類;
按性別名稱身高;
如果first.name;
跑;
我的同事布雷迪布拉迪很友好,可以幫助我使用Col Min()和Col Max()在JSL中解決這個問題。 圖1包含一個示例數據集。原始數據僅包括Letter(A至J)和Letter 2(A至D)。 數據表按這兩個變量排序。您可以在下面看到,對於Letter中每個字母的第一個實例,First.Letter等於1(否則為0); Last.Letter是一個1,表示Letter中每個字母的最後一個實例(否則為0)。這些變量的公式如下:
First.Letter = If(Row()== Col Minimum(Row(),:Letter),
1,
0
)
Last.Letter = If(Row()== Col Maximum(Row(),:Letter),
1,
0
)
要解釋這些公式,Col M ** imum()函數正在使用:按組分組,並在Letter的每個值中獲取最小或最大行數。如果當前行號等於:特定於字母的最小行號,則If()函數將First.Letter設置為1。 請注意,如果:Letter的特定值只有一行,那麼該記錄將被視為第一行和最後一行 First.Letter = 1和 Last.Letter = 1

圖1。數據表FirstLast
與上面的SAS代碼類似,這可以通過變量擴展多個。 假設我想選擇Letter2的每個字母的第一個實例內信,我只是在函數中添加了一個額外的byvar。
First.Letter2 = If(Row()== Col Minimum(Row(),:Letter,:Letter2),
1,
0
)
Last.Letter2 = If(Row()== Col Maximum(Row(),:Letter,:Letter2),
1,
0
)
這些函數具有一個有用的功能,它允許您輕鬆地按發生重複的組進行子集化。 選擇行在哪裡 First.Letter = 0或 Last.Letter = 0將選擇所有行:字母重複。在Big Class的上下文中,使用以下函數:Height可以允許您創建可以重複特定高度的子表。
請注意,在SAS中,需要排序才能創建特殊的first.XX last.XX變量。 雖然上面的數據表已經過排序,但這不是上面的JSL代碼要求工作的要求。
非常感謝Brady Brady的幫助!