JSL程式碼和總結幫助JMP 社群您好,
JMP Pro v17。
我有一個上個月一直有效的腳本,但現在似乎不再有效了。我有一個資料表,其中一列名為:日期(請參閱附加的資料表)。以下腳本應該按 :Date 的 Year( ) 匯總資料表,並為變數「yrs」產生年份清單。
Summarize( dt, yrs = By( Year( :Date ) ) );
例如,它應該返回 {"2022", "2023", "2024"} 等日期列表,因為 Year( ) 命令應該只從 :Date 列中提取年份值,但事實並非如此。
如果刪除 :Date 周圍的 Year( ) 命令並如下執行:
Summarize( dt, yrs = By( :Date ) );
結果是所有單獨日期的列表,以下是摘錄:
{“09/29/0263”,“01/30/1930”,“02/11/1955”,“05/03/2002”,“08/13/2002”,“10/19/2002”,
「01/01/2021」、「01/02/2021」、「01/06/2021」、「01/18/2021」、「01/30/2021」、「02/12/2021」、
「2021年2月13日」、「2021年2月15日」、「2021年3月26日」、「2021年3月27日」、「2021年3月28日」、「2021年3月30日」、
“2021年4月23日”、“2021年4月24日”、“2021年4月25日”,}
有一些日期輸入錯誤,但現在可以忽略。
我實際上並不想要所有單獨的日期,我只想要所有年份的清單。不幸的是,當我嘗試執行 yr = Year( :Date) 時,我得到 yr 的 null/空變數。這最終導致無法由原始 JSL 中圍繞它的下一個 By( ) 命令進行評估。我不知道我是否需要
我覺得奇怪的是,大約一個月前,當我建立這段程式碼時,它似乎運作得很好,但現在它不能像以前那樣工作了。
我確信我錯過了導致這個問題的一些簡單的東西,但我不知道它是什麼。或者,我正在考慮 Summarize( ) 和/或它如何使用其中的 By( ) 群組。
感謝您的任何想法/反饋!
DS
自動化和腳本編寫大規模客製化視窗回覆:JSL 代碼和總結幫助你好,
您需要如下評估 Year 函數:
Eval(Eval Expr(summarize (dt, yr = By(Year(:Date)))));
最好的,
TS
回覆:JSL 代碼和總結幫助我認為您不能使用 Summarize 來做到這一點,但如果您不想在表中建立新列,則可以將 Summary 與轉換列一起使用
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
years = dt_summary[0, 1];
Close(dt_summary, no save);
Show(years);
回覆:JSL 代碼和總結幫助嗨@Thierry_S和@jthi ,
感謝你們的快速回饋和想法。我可能太快將其標記為已解決,因為剛剛發生了一些奇怪的事情。
我嘗試運行@Thierry_S的 Eval( Eval Expr( )) 包裹著匯總命令,當我在測試資料表(只是日期之一)上測試它時它起作用了,但是當我移動到原始資料表,它停止工作,並且出現以下錯誤:在「Year」的存取或評估中找不到列,Year/*###*/(:Date)。
現在,當我返回並嘗試在“假”日期資料表上執行此操作時,我再次收到錯誤。
@jthi ,你的選擇是一種可能性,但我需要將它從矩陣(或一維向量變成數字列表)——有什麼快速的方法可以做到這一點嗎?我需要這樣做,因為我在關聯數組中使用年份列表。
謝謝!
DS
回覆:JSL 代碼和總結幫助關聯數組中的鍵是整數還是字串?如果它們是整數,則可以使用 As List())
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
years = dt_summary[0, 1];
Close(dt_summary, no save);
show(As List(years)); // As List(years) = {263, 1930, 1955, 2002, 2021, 2022, 2023, 2024, 2025};
如果它們是字串,我會將列更改為字符,然後獲取值
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
Column(dt_summary, 1) << Set Data Type("Character");
years = dt_summary[0, 1];
Close(dt_summary, no save);
show(years); // years = {"263", "1930", "1955", "2002", "2021", "2022", "2023", "2024", "2025"};
回覆:JSL 代碼和總結幫助我有一個上個月一直在運行的腳本
也許是由於預先存在的列?

回覆:JSL 代碼和總結幫助總結與變換列的配合:
dt = Open( "$SAMPLE_DATA/Hurricanes.jmp" );
dt << Transform Column( "tmp", Formula( year(:date) ) );
Summarize(years = by (tmp));
//dt << Delete Columns( :tmp );
Show(years)
如果您忘記刪除轉換列,請不要擔心,它會在下一次「開啟」後消失。
回覆:JSL 代碼和總結幫助嗨@jthi ,
感謝您的回饋和建議。我確實需要年份作為字串,因為我最終會在組合框中使用它們,而組合框只接受字串。
感謝您的所有幫助和故障排除!
DS
回覆:JSL 代碼和總結幫助嗨@hogi ,
所有資料表都有相同的列名:日期,而且它們都是數字連續列,所以我不確定為什麼它以前有效且現在無效。而且,奇怪的是它適用於 Hurricanes.jmp 數據表,但不適用於我的數據表。我真的不明白為什麼會發生這種情況,但確實如此。
不管怎樣,Jarmo 建議的方法效果很好,並且不會像 Summarize(By( )) 指令那樣挑剔。
謝謝!
DS
回覆:JSL 代碼和總結幫助對於 Hurricanes.jmp,它的工作原理是由於:year列。
JMP 將年份(:日期)重新路由為:年份?!?
回覆:JSL 代碼和總結幫助嗨@hogi ,也許吧。我不知道,也不明白為什麼 JSL 會這麼做。我剛剛測試了該理論,果然,Summarize 命令不起作用,因為列:Year 消失了。太奇怪了!而且,即使 :Date 欄位是 Hurricanes.jmp 檔案中的公式,也沒關係。如果刪除公式,它可以正常工作,但如果刪除列:年份,它就不再有效。我不明白 JSL 背後的邏輯,但事實就是如此。