안녕,
환자 집단에 대한 두 개의 데이터 세트가 있습니다.하나는 테스트 날짜가 "a"이고 다른 하나는 테스트 날짜가 "b"입니다. 한 과목에 대한 시험 a와 b의 수는 다양합니다. (즉, 어떤 시험은 a가 많고 b가 적거나 그 반대입니다.)
테스트 a와 b가 일정 기간(이 프로젝트의 경우 90일) 내에 있는 모든 인스턴스를 찾아야 합니다.이 매개변수 내에서 테스트를 찾기 위해 테스트 a와 b의 모든 조합 비교를 어떻게 자동화할 수 있습니까?다르게 말하면, 모든 테스트 a 날짜를 모든 테스트 b 날짜와 비교하여 날짜 차이를 계산하고 <90일을 분리하려면 어떻게 해야 합니까?모든 날짜-차이 조합 목록을 얻으면 <90일을 찾기 위해 쉽게 정렬할 수 있습니다.
아래 예
데이터세트1
제목 # 시험 날짜
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 90일
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 테스트보다 앞에 있다는 점을 고려하면 절대값이 더 의미가 있다고 생각합니다.
내 목표는 서로 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가 생성한 스크립트를 사용하여(주제별 연결, 날짜 차이에 따라 새 열 추가(마우스 오른쪽 버튼 클릭 메뉴에서 가능)), 두 번째 열을 추가하여 차이가 충분히 작은지 확인하는 것이 좋을 것 같습니다. , 이를 기반으로 선택을 수행하고 추가 행을 제거합니다. 둘 다 @txnelson 그리고 @dale_lehman 어느 정도 이것을 제안했습니까?
가입하다:

첫 번째 코뮬러 열 추가

두 번째 수식 추가

0개의 행을 선택하고 삭제하세요.

최종 결과

JMP가 생성한 스크립트(이것은 약간 정리되어야 합니다. 이에 관한 좋은 게시물입니다.) 더 나은 JSL 원활한 마이그레이션: 자신의 코드를 수정하는 방법 )
