你好,
我有一组患者的两个数据集。一个具有测试“a”的日期,另一个具有测试“b”的日期。某个主题的测试 a 和 b 的数量各不相同(即,有些测试 a 较多,b 较少,反之亦然)
我需要找到测试 a 和 b 在某个时间范围内(该项目为 90 天)的所有实例。如何自动比较测试 a 和 b 的所有组合以找到此参数内的测试?换句话说,如何将每个测试 a 日期与所有测试 b 日期进行比较以计算日期差异(并隔离那些 <90d 的日期)?如果我只得到所有日期差异组合的列表,我可以轻松排序以找到那些 <90d
下面的例子
数据集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 日期
2014 年 1 月 1 日
1 6/1/23
1 11/1/22
2 1/1/10
2 1/1/23
2 1/5/23
结果
主题 测试 a 日期 测试 b 日期 日期差异
1 23年1月1日 22年11月1日 60天
1 23/1/3 23/6/1 90天
2 2010年2月1日 10年1月1日 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 );
我得到了和你一样的东西,除了两项:我计算了几个月而不是几天的差异(一个疏忽 - 天更有意义),并且你使用了差异的绝对值。请求中并不清楚该因素 - 我通常认为测试是连续的(A 在 B 之前),但考虑到许多 B 测试在 A 测试之前,我想绝对值更有意义。
我的目标是隔离受试者,将其纳入一项研究,这些受试者在 90 天内完成了测试 a 和 b。我的结果仅列出了其间 <=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 为您创建的脚本(按主题加入,根据日期差异添加新列(右键单击菜单可以执行此操作),添加第二列以检查差异是否足够小,据此执行选择并删除多余的行)。 两个都@tx尼尔森和@dale_lehman或多或少暗示了这一点
加入:

添加第一个公式列

添加第二个公式

选择 0 行并删除它们

最后结果

JMP 创建的脚本(应该稍微清理一下,关于这个的好帖子更好的 JSL 更平滑的迁移:如何修复您自己的代码)
