時間を時間間隔に変換し、2番目の列の値に基づいてリセットして、X軸のオフセットを防ぎます。「時間」(数値、連続、12時間単位のh:m:sで表示)と「名前」(文字、各時点が関連付けられている実験のリスト)の列を持つデータテーブルがあります。ここで言及されていない他の列をY軸、時間をX軸としてグラフを作成すると、X軸のスケールがXグループ変数間で同じであるため、Xグループ変数間の各プロットがずれるという問題が発生します(図1)。

図 1. 各 x グループ化変数は、「名前」列変数であり、「名前」はオーバーレイとしても表示されます。
私の考えは、次のようなスクリプトを書くことです:
1. 新しい列を作成する
2. 「Time」列を秒単位の時間に変換する数式を使用して新しい列をコーディングします。この数式は「0」から始まり、指定された間隔(この場合は 2 秒)でカウントアップし、「Name」列の値が変わるとすぐに 0 にリセットされます。
私の主な質問は次のとおりです。
1. これは可能ですか?
2. 新しい列を作成せずにこれを行うより簡単な方法はありますか?
現在、Windows 10 で JMP 17.2.0 を使用しています。
ありがとう!
データの探索と可視化Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐこれが必要な機能を果たすかどうかを確認してください。
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐ返信ありがとうございます!
残念ながら、下の図に示す「経過時間」の列が返されます。

以下のコードを試してみたところ、上の図の「Time (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 ) )
)
)
);
Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐ:LocalTime列に予期せぬ問題が発生している可能性があります。作成したテーブルで数式を試してみたところ、意図したとおりに動作しました。:LocalTime列のフォーマットはどのようになっていますか?

Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットして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 ) ) );
次のような出力が得られました

Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐまあいいや、投稿したコードはちゃんと動いたよ!列名のスペルミスだったんだ:confounded_face:
残る唯一の疑問は、新しい列を作成せずにこれを行うより簡単な方法があるかどうかです。
Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットして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 ) ) )
);
Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐグラフビルダーを実行する際は、いつでも変換(仮想)列を使用できます。これにより、データテーブルに実際の列を用意する必要がなくなります。
Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐ完璧です。素晴らしい解決策をくださった@txnelsonさん、そしてありがとうございます!
Re: 時間を時間間隔に変換し、2番目の列の値に基づいてリセットしてx軸のオフセットを防ぐちなみに、JMPでは測定単位を「単位」列プロパティに入力するのが標準です。あなたの場合、実際の列名は「時間」ですが、デフォルトでは「単位」の値が括弧で囲まれて表示されるため、表示値は「時間(秒)」と変更されます。