안녕하세요 여러분,
테이블에 논리와 일치하는 값이 있는 다른 행이 있는지 여부에 따라 각 행에 대해 특정 값("좋음", "나쁨" 또는 "해당 없음")을 설정하는 수식이나 스크립트를 만들려고 합니다. 현재 행을 입력으로 사용합니다.
전체 데이터 테이블의 작은 하위 집합을 사용할 때 중첩된 For 루프를 사용하여 이 작업을 수행하는 스크립트가 있습니다. 그러나 사용하려고 하는 전체 데이터 테이블(약 100만 행)에서는 스크립트가 JMP와 충돌합니다.
JMP에서 이 작업을 수행할 수 있는 더 효율적인 방법이 있습니까? (또는 SQL로 수행할 수 있는 경우 JMP로 가져오기 전에 수행할 수 있습니다.)
내가 말하는 내용을 수행하는 스크립트는 첨부된 내용을 참조하세요.
일반적으로 데이터 테이블로 작업할 때 for 루프를 중첩할 필요가 없습니다.
데이터의 작은 하위 집합을 제공하고 원하는 결과가 포함된 열을 포함할 수 있습니까?
좋아, 나는 개인정보 보호상의 이유로 데이터를 조롱할 것이다.
| 콜라 | colB | 콜C | colDate | 서양 평지 | 논리 |
| A0001 | 16 | 100 | 2022/04/01 오전 9:15:01 | 액션1 | 해당 없음 |
| A0001 | 100 | 182 | 2022/04/01 오전 9:15:31 | 액션2 | 좋은 |
| A0001 | 100 | 100 | 2022/04/01 오전 9:15:36 | 액션1 | 해당 없음 |
| A0002 | 212 | 200 | 2022/04/02 오전 3:15:21 | 액션1 | 해당 없음 |
| A0002 | 211 | 282 | 2022/04/02 오전 3:15:11 | 액션2 | 나쁜 |
| A0002 | 212 | 200 | 2022/04/02 오전 3:15:16 | 액션1 | 해당 없음 |
| A0003 | 441 | 382 | 2022/05/01 오전 1:15:31 | 액션2 | 나쁜 |
| A0004 | 441 | 382 | 2022/05/01 오전 5:16:31 | 액션2 | 나쁜 |
| A0004 | 441 | 300 | 2022/05/01 오전 5:15:31 | 액션1 | 해당 없음 |
원본 스크립트의 논리가 명확하지 않은 경우:
현재 행의 colE가 "Action 1"인 경우: "N/A"를 할당합니다.
그렇지 않으면 현재 행의 colE가 "Action 2"인 경우 다음 단락의 논리를 따릅니다.
colA 및 colB 열에 대해 현재 행과 동일한 값을 갖는 다른 행이 테이블에 존재하는 경우; 현재 행의 colC 값은 이 다른 행보다 정확히 82 더 많습니다. colDate 값은 서로 18초 이내입니다. 현재 행의 colE는 "Action 2"이고 이 다른 행의 colE는 "Action 1"입니다. 그런 다음 "Good"을 할당합니다. 그렇지 않으면 "Bad"를 할당합니다.
도움을 주셔서 감사합니다! 지금은 중첩 루프가 없는 방법이 보이지 않습니다.
하지만 이제 적어도 원본 스크립트의 25번째 줄 뒤에 Break()를 넣어야 한다는 것을 깨달았습니다. 하나 이상의 존재를 이미 찾은 경우 내 기준과 일치하는 다른 행을 계속 찾을 이유가 없습니다.
이 스크립트의 논리는 데이터의 모든 제한 사항(예: 여러 일치 항목이 있을 수 있음)을 알지 못하고 최적화하지 않았기 때문에 지나치게 복잡합니다.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(9),
Compress File When Saved(1),
New Column("colA", Character, "Nominal", Set Values({"A0001", "A0001", "A0001", "A0002", "A0002", "A0002", "A0003", "A0004", "A0004"})),
New Column("colB", Numeric, "Continuous", Format("Best", 9), Set Values([16, 100, 100, 212, 211, 212, 441, 441, 441])),
New Column("colC", Numeric, "Continuous", Format("Best", 9), Set Values([100, 182, 100, 200, 282, 200, 382, 382, 300])),
New Column("colDate",
Character(22),
"Nominal",
Set Values(
{" 2022/04/01 9:15:01 AM", " 2022/04/01 9:15:31 AM", " 2022/04/01 9:15:36 AM", " 2022/04/02 3:15:21 AM", " 2022/04/02 3:15:11 AM",
" 2022/04/02 3:15:16 AM", " 2022/05/01 1:15:31 AM", " 2022/05/01 5:16:31 AM", " 2022/05/01 5:15:31 AM"}
)
),
New Column("colE",
Character(16),
"Nominal",
Set Values({"Action1", "Action2", "Action1", "Action1", "Action2", "Action1", "Action2", "Action2", "Action1"})
),
New Column(" Logic", Character(16), "Nominal", Set Values({" N/A", " Good", " N/A", " N/A", " Bad", " N/A", " Bad", " Bad", " N/A"}))
);
dt << New Column("Group", Character, Nominal, << Set Each Value(char(:colA)||char(:colB)));
//fix date
Column(dt, "colDate") << Set Each Value(Substitute(:colDate, " AM", "")) << Data Type(Numeric);
dt << New Column("Logic", Character, Nominal, << Set Each Value(
As Constant(
m_group = :Group << get values;
m_c = :colC << get values;
m_date = :colDate << get values;
);
If(:colE == "Action1",
"N/A";
, :colE == "Action2",
cur_group_idx = Loc(m_group, :Group);
If(N Items(cur_group_idx) == 0,
"Bad"
,
plus_idx = cur_group_idx[Loc(:colC - 82 == m_c[cur_group_idx])];
If(N Items(plus_idx) == 0,
"Bad"
,
timediff_idx = Loc(Abs(m_date[plus_idx] - :colDate) <= 18);
If(N Items(timediff_idx) > 0,
If(:colE == "Action2" & :colE[timediff_idx[1]] == "Action1",
"Good"
,
"Bad"
)
,
"Bad"
);
)
);
,
"Bad";
);
));
dt << Delete Column("Group");
