建立腳本以僅選擇與特定日期範圍相關的某些值我得到了一個與此類似的文件

我被要求創建一個公式來提取開始日期和停止日期之間發生的所有代碼。我不確定如何將其設定為公式。是否可以將其建立為腳本來提取開始日期和停止日期之間發生的所有程式碼?我以前從未設定過腳本,希望有人能指導我如何建立腳本。
謝謝!
數據探索和視覺化回覆:建立腳本以僅選擇與特定日期範圍相關的某些值歡迎來到社區。
實際的語句將選擇給定日期範圍內的行並建立一個僅包含這些選定行的新資料表。
// Select the row that have the date range desired
dt << select where( :Start Date >= informat("01/10/2025","m/d/y") &
:End Date <= informat("04/30/2025","m/d/y"));
// Create the new table
dtSubset = dt << subset( selected columns(0), selected rows(1), output table("theSubset"));
這是一個完整的範例,首先建立一個範例資料表,然後執行上述行來選擇並建立資料表。
(註:下面的例子在原始帖子中以某種方式被遺漏了。感謝@jthi對遺漏的提醒)
Names Default To Here( 1 );
// Create an Example data table
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Start Date",
Format( "m/d/Y" ),
set each value( Today() + In Days( Random Integer( 1, 100 ) ) )
),
New Column( "End Date",
Format( "m/d/Y" ),
set each value( :Start Date + In Days( Random Integer( 1, 50 ) ) )
)
);
// Select the row that have the date range desired
dt << select where(
:Start Date >= Informat( "01/10/2025", "m/d/y" ) & :End Date <=
Informat( "04/30/2025", "m/d/y" )
);
// Create the new table
dtSubset = dt << subset(
selected columns( 0 ),
selected rows( 1 ),
output table( "theSubset" )
);
創建新表的另一種有趣的互動式方法是使用資料過濾器。資料過濾器允許使用者互動地選擇資料表中的行,一旦選擇了所需的行,就可以從這些行建立一個新表。
為此:一旦顯示數據表

轉到行下拉選單並選擇“資料過濾器”

在「資料過濾器」視窗中,選擇開始日期和結束日期,然後按一下 + 號

然後將顯示過濾器。
按一下顯示和包含複選框。指示當篩選器的設定選擇行時對資料表中的行所採取的動作。

現在可以設定過濾器來進行選擇。可以將藍線拖曳到所需的開始日期和結束日期,或者可以直接在每個篩選器的顯示日期區域中輸入數值。
請注意當篩選器變更時資料表中的行如何被選擇

選擇所需的行後,可以從資料篩選器紅色小三角的操作清單中選擇顯示子集選項來建立新的資料表。只需單擊資料過濾器標題旁邊的紅色三角形並選擇該選項


回覆:建立腳本以僅選擇與特定日期範圍相關的某些值您能否提供範例表以便更輕鬆地建立範例?
我很可能不會為此創建一個公式,而是一個腳本。我假設您希望提取所有 code_x 值,其中 date_x 落在每行的開始日期和結束日期之間?應該在哪裡記錄它們?對於重複的該怎麼辦?資料格式可以改變(資料可以堆疊)嗎?
@txnelson JMP 社群是否放棄了您的完整範例?
回覆:建立腳本以僅選擇與特定日期範圍相關的某些值這是一個要使用的範例表。你是對的,我需要查看每一行並獲取開始日期和結束日期之間每個日期的程式碼。如果有重複也沒關係。最終,我需要知道所有程式碼是否相同,或者每個時間範圍內是否有不同的程式碼。我需要知道每一行開始日期和停止日期之間的程式碼是否全部為“2”或全部為“3”或程式碼的組合。
我認為這必須是某種腳本,因為我想不出可行的公式。我沒有創建腳本的經驗,所以任何幫助將不勝感激!
回覆:建立腳本以僅選擇與特定日期範圍相關的某些值考慮到您的最終需求,這很可能會變得更加簡單,但由於沒有確切的規格/結果列,我只是創建了一些我認為應該幫助您前進的內容
Names Default To Here(1);
dt = Open("$DOWNLOADS/example table.jmp");
Try(Column(dt, "Date 1") << Set Name("date_1"));
date_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "date_");
);
code_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "code ");
);
dt << New Column("Result", Character, Multiple Response);
For Each Row(dt,
dates = dt[Row(), date_cols];
between_bin = :"Start date"n <= dates <= :"Stop date"n;
between_idx = Loc(between_bin);
If(N Items(between_idx) > 0,
codes = dt[Row(), code_cols[between_idx]];
valid = Loc(codes);
If(N Items(valid) == 0,
codes = {};
,
codes = As List(codes[valid`]);
);
,
codes = {};
);
res = Transform Each({code}, codes,
Char(code);
);
:Result = Concat Items(res, ", ");
);

回覆:建立腳本以僅選擇與特定日期範圍相關的某些值Jarmo 的程式碼非常精彩。我喜歡看到他如何處理和解決問題。但是,在我生命的大部分時間裡,我的同事、朋友、配偶和孩子都認為我的想法很奇怪。心情好的時候,我被稱為「書呆子」。
因此,考慮到我的生活狀況,我發現大多數人的想法與我不同。
@PruningTheSpark指出
「我認為這必須是某種腳本,因為我想不出一個可行的公式。我沒有創建腳本的經驗,所以任何幫助將不勝感激!! 」。
我相信大多數 JMP 使用者都接近 PruningTheSpark 的立場。 PruningTheSpark 可能不認為有非腳本解決方案可以解決這個問題,但 JMP 操作資料的互動功能確實非常強大。因此,以下我整理了解決 PruningTheSparks 問題所需的互動式步驟。
從提供的範例資料表開始,我稍微修改了它。根據 Jamo 腳本的結果,它表明沒有任何行具有多個有效代碼。鑑於可能存在多個程式碼,我在第 2 行新增了程式碼,程式碼將顯示第 2 行具有多個程式碼。

第一個任務是尋找開始日期和停止日期內的所有代碼。由於有 6 個不同的程式碼列,因此一次執行此操作的最簡單方法是堆疊資料。
表=>堆疊

它是一個多系列堆疊,放置日期和程式碼列
現在我可以刪除所有缺少值的程式碼,因為它們不會計入結果。因此,我選擇了“資料 2”列中缺少值的一個單元格,該列包含所有程式碼,然後右鍵單擊並選擇“選擇配合單元格”

它選擇列 Data 2 缺少值的所有行。
右鍵單擊 RowState 列並選擇刪除行

只剩下有程式碼的行

現在我需要確定哪些代碼屬於開始日期和停止日期。為此,我將創建一個新列,我將其稱為“中間”,其公式為

其中資料列(包含原始表中的日期)的行為 1,其中 1 表示在範圍內,0 表示在範圍外

使用與刪除缺失值的程式碼相同的技術,可以選擇並刪除帶有零的行

為了清理表,可以刪除一些不再需要的列

現在的任務是將程式碼恢復為單行。為此,可以進行簡單的拆分
表格=>拆分


現在,要將程式碼列合併為一列,可以使用名為「組合列」的列公用程式。只需選擇要合併的列,然後
列=>實用程式=>合併列

這會彈出一個輸入框來填寫新列的名稱,以及在項目之間放置什麼分隔符,在本例中為“,”

這會導致表中有一個新列

透過刪除不再需要的欄位來清理表

現在要做的就是將結果移回原始資料表中。要做到這一點,更新平台就可以做到這一點。點擊原始表格並
表格=>更新

填寫要從中取得更新的表,然後選擇將原始表的 record_id 與分割表中的 record_id 相匹配,然後按一下“確定”,原始表將包含解決方案

沒有使用腳本,只需要 2 個簡單的公式列。
現在,當執行這些步驟時,JMP 會將建立所執行的互動式步驟所需的 JSL 放入日誌中。因此,人們可以簡單地將這些 JSL 片段複製到腳本中,最後得到一個腳本,運行該腳本時,眨眼間就會得到解決方案。
names default to here(1);
dt = data table( "Example Table" );
// Stack data table
// → Data Table( "Stacked" )
dtStacked = Data Table( "example table" ) << Stack(
columns(
:date_1, :code 1, :date_2, :code 2, :date_3, :code 3, :date_4, :code 4,
:date_5, :code 5, :date_6, :code 6
),
Number of Series( 2 ),
Output Table( "Stacked" )
);
wait(0);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( Is Missing( :Data 2 ) ) << Delete Rows;
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Label, :Label 2 );
// New column: is between
Data Table( "Stacked" ) << New Column( "is between",
Numeric,
"Continuous",
Format( "Best", 12 )
);
// Change column formula: is between
Data Table( "Stacked" ):is between << Set Formula(
:Data >= :Start date & :Data <= :Stop date
);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( :is between == 0 ) << delete rows;
// Delete column: is between
Data Table( "Stacked" ) << Delete Columns( :is between );
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Stop date, :Start date, :Data );
// Split data table
// → Data Table( "Split" )
Data Table( "Stacked" ) << Split(
Split By( :Data 2 ),
Split( :Data 2 ),
Group( :record_id ),
Output Table( "Split" ),
Sort by Column Property
);
// Combine columns
Data Table( "Split" ) << Combine Columns(
columns( :"1"n, :"2"n, :"3"n ),
Column Name( "Result" ),
Delimiter( "," )
);
// Delete columns
Data Table( "Split" ) << Delete Columns( :"1"n, :"2"n, :"3"n );
// Update data table
Data Table( "example table" ) << Update(
With( Data Table( "Split" ) ),
Match Columns( :record_id = :record_id )
);
人們還可以開啟一個新的工作流程,打開記錄器並逐步執行這些步驟,您最終將獲得一個可在將來用於建立解決方案的工作流程。

回覆:建立腳本以僅選擇與特定日期範圍相關的某些值非常感謝您的幫忙!
回覆:建立腳本以僅選擇與特定日期範圍相關的某些值非常感謝您的幫忙!螢幕截圖非常有幫助!