こんにちは、
患者のコホートに関する 2 つのデータセットがあります。1 つはテスト「a」の日付を持ち、もう 1 つはテスト「b」の日付を持ちます。ある主題に関するテスト a と b の数は異なります (つまり、a が多く b が少ないもの、あるいはその逆のものもあります)
テスト a と b が期間 (このプロジェクトでは 90 日) 内にあるすべてのインスタンスを検索する必要があります。テスト a と b のすべての組み合わせの比較を自動化して、このパラメーター内のテストを見つけるにはどうすればよいでしょうか?別の言い方をすると、すべてのテスト a の日付とすべてのテスト b の日付を比較して日付の違いを計算する (そして 90 日未満のものを分離する) にはどうすればよいでしょうか?すべての日付と差分の組み合わせのリストを取得するだけで、90 日未満のものを簡単に並べ替えることができます。
以下の例
データセット1
科目番号 テストAの日付
1 1/1/23
1 2/1/23
1 3/1/23
1 4/1/23
2 2/1/10
2 5/1/10
データセット2
被験者番号 テストBの日付
1 1/1/14
1 6/1/23
1 11/1/22
2 1/1/10
2 1/1/23
2 1/5/23
結果
主題テスト a 日付テスト b 日付 日付の差分
1 1/1/23 11/1/22 60日
1 3/1/23 6/1/23 90d
2 2/1/10 1/1/10 30日
データセットを件名ごとに結合し、datedifference 関数を使用してテスト A とテスト B の差を計算してみます。すべてのテストのペアのすべての差が必要なのか、それとも最小または最大の差だけが必要なのか、私には少しわかりません。最小値または最大値の場合、日付の差を計算する前に、テスト A および B の最も古い日付および/または最も新しい日付の新しい列を作成できるはずです。すべての差異が必要な場合は、日付の差異を計算する前に、データセットを再構築する必要がある場合があります (データセットを結合した後にテスト A 列とテスト B 列を積み重ねることなど)。
上記の例の 3 つのデータ セットを添付します。結果テーブルの意味がわかりません。表示されているよりも多くの一致があります。したがって、これが私が添付したものの短縮形であれば、これでうまくいくはずです。本当にこれら 3 つの一致と違いだけを結果に表示したいのであれば、必要な一致をどのように選択しているのか理解できません。
私は信じます
Tables=>Join で希望通りのことができます。

以下は、2 つのサンプル テーブルを作成し、それらを結合して、日付の差が 90 を超えるすべての行を強調表示するスクリプトです。
Names Default To Here( 1 );
dt1 = New Table( "Dataset1",
Add Rows( 6 ),
New Column( "Subject",
Character,
"Nominal",
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Values( {"1", "1", "1", "1", "2", "2"} )
),
New Column( "Test A Date",
Numeric,
"Nominal",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Selected,
Set Values( [3755376000, 3758054400, 3760473600, 3763152000, 3347827200, 3355516800] )
)
);
dt2 = New Table( "Dataset2",
Add Rows( 6 ),
New Column( "Subject",
Character,
"Nominal",
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Values( {"1", "1", "1", "2", "2", "2"} )
),
New Column( "Test B Date",
Numeric,
"Nominal",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Selected,
Set Values( [3471379200, 3768422400, 3750105600, 3345148800, 3755376000, 3755721600] )
),
Set Row States( [1, 0, 0, 0, 0, 0] )
);
// The code below is the code that does the work.
dtFinal = dt1 << Join(
With( dt2 ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( :Subject = :Subject ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
Output Table( "Final" )
);
dtFinal << New Column( "Date Diff in Days", formula( Abs( :Test A Date - :Test B Date ) / In Days( 1 ) ) );
dtFinal << select where(:Date Diff in Days > 90 );
私は 2 つの項目を除いて、あなたと同じ結果を得ました。私は日ではなく月で差を計算しました (見落とし - 日の方が合理的です)。そして、あなたは差の絶対値を使用しました。その要素はリクエストからは不明です。通常はテストが連続している(AがBに先行する)と考えますが、多くのBテストがAテストに先行していることを考えると、絶対値の方が合理的だと思います。
私の目標は、試験 a と b を 90 日以内に受けた被験者を分離して研究に含めることです。私の結果は、望ましい結果であるため、間の間隔が <=90d であるテストのペアのみをリストします。
したがって、私の解決策またはtxnelsonの解決策のどちらでも機能します(彼はコーディングウィザードであり、私はマウスを使用するだけです)。日付の差を計算したら、90 日未満を選択するか、インジケーター (1 対 0 など) で 90 日未満を識別する列を作成します。
これに使用できるアドインも作成しました (使いにくく、自動化は少し難しいかもしれませんが、可能であるはずです)。 最も近い行を結合 - 連続列と最も近い値を使用してテーブルを結合します。 。 いつかこれを書き直す時間ができれば幸いです
JMP の日時は秒単位であるため、許容値は 7776000 に設定されます。 後方または前方に結合できるため、結合方向は「最近接」になります。

結果から、一致しない余分な行を削除できます

いくつかの掃除の後

SQLを知っている場合はそれを使用できます
Query(
Table(dt1, "dt1"),
Table(dt2, "dt2"),
"\[SELECT dt1.*, dt2."Test B Date", Abs(dt1."Test A Date" - dt2."Test B Date") / (24*60*60) DeltaDays
FROM dt1
join dt2 on dt1.subject = dt2.subject
where
Abs(dt1."Test A Date" - dt2."Test B Date") <= 90*24*60*60
]\"
);
ただし、この場合は、JMPの対話型ソリューションを使用し、JMPが作成したスクリプトを使用すると思います(件名ごとに結合し、日付の違いに基づいて新しい列を追加し(右クリックメニューでこれを行うことができます)、2番目の列を追加して違いが十分小さいかどうかを確認します) 、それに基づいて選択を実行し、余分な行を削除します)。 両方@txnelsonそして@dale_lehman多かれ少なかれこれを示唆しました
参加する:

最初のカミュラ列の追加

2 番目の式を追加する

0 行を選択して削除します

最終結果

JMP が作成したスクリプト (これは少しクリーンアップする必要があります。これに関する良い投稿) JSL のよりスムーズな移行: 独自のコードを修正する方法)
