將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移我有一張資料表,其中包含「時間」列(數值型,連續,格式為 12 小時制,時:分:秒),以及「名稱」列(字元型,即每個時間點對應的實驗列表)。當我使用此處未提及的其他列作為 Y 軸,以「時間」作為 X 軸繪製圖表時,出現了一個問題:由於 X 軸比例在 X 分組變數之間保持不變,因此 X 分組變數之間的每個圖都會發生偏移(圖 1)。

圖 1. 每個 x 分組變數都是「名稱」列變量,其中「名稱」也作為覆蓋。
我的想法是寫一個腳本來:
1. 建立新列
2. 使用公式編寫新列,將「時間」列轉換為以秒為單位的時間,從「0」開始並以指定的間隔(在本例中為 2 秒)向上計數,一旦「名稱」列的值發生變化,就重設為 0。
我的主要問題是:
1. 這可能嗎?
2. 有沒有更簡單的方法可以做到這一點而不需要建立新的列?
目前在 Windows 10 上使用 JMP 17.2.0。
謝謝!
數據探索與視覺化回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移看看這是否能滿足您的需求。
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移謝謝您的回覆!
不幸的是,這將傳回下圖所示的「已使用時間」列。

我嘗試了以下程式碼,它也產生了上圖中的「時間(s)」列。它似乎執行了將初始值設為零的功能,但沒有轉換其他任何值。
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
);
回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移您的 :LocalTime 列可能會有一些意外情況。我在一個虛構的表格上嘗試了我的公式,它按預期工作。您的 :LocalTime 列的格式是什麼?

回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移我建立了一個範例資料表

然後我運行了以下 JSL
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
)
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
得到以下輸出

回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移好吧,沒關係,我發布的程式碼確實有效!我的列名拼字錯了:confounded_face:
那麼剩下的唯一問題是,有沒有更簡單的方法可以做到這一點而不需要建立新的列?
回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移它需要一個新列。它不必是持久列,這意味著它可以是僅在圖表存在時存在的列。
Graph Builder(
Transform Column(
"Time (s)",
Formula( :LocalTime - Col Min( :LocalTime, :Name ) )
),
Show Control Panel( 0 ),
Variables( X( :"Time (s)"n ), Y( :Y Column ), Group X( :Name ) ),
Elements( Smoother( X, Y, Legend( 8 ) ) )
);
回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移執行圖形產生器時,您始終可以使用轉換(虛擬)列。這樣,資料表中就無需包含實際欄位。
回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移太完美了。感謝你和@txnelson提供的出色解決方案!
回覆:將時間轉換為時間間隔並根據第二列值重設以防止 x 軸偏移順便提一下,JMP 的標準做法是將測量單位放入「單位」列屬性中。您的情況有所不同,實際列名應該是“時間”,但預設情況下,“單位”值會顯示在一對括號中,從而顯示的值會變更為“時間(秒)”。