Col 현재 행의 값을 호출하지 않고 누적 합계안녕하세요. 저는 JMP 스크립트 작성이 처음이고 작업에 주로 "공식 편집"을 사용합니다. Col Cumulative Sum 과 관련된 솔루션을 검색했지만 내 특정 문제에 대한 솔루션을 찾을 수 없습니다. 내 데이터 테이블의 단순화된 버전은 다음과 같습니다.
| 열 | 주 | Col Cumulative Sum | 내 소원 |
| 1 | 1 | 1 | 0 |
| 2 | 2 | 3 | 1 |
| 3 | 3 | 6 | 3 |
| 4 | 4 | 10 | 6 |
| 5 | 5 | 15 | 10 |
| 6 | 6 | 21 | 15 |
아래 공식은 "주"의 현재 행 값이 고정되어 있거나 "주"와 "내 소원"이라는 두 개의 별도 열이 있는 경우 작동합니다.
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
문제는 이전 행의 "주" 값은 고정되어 있지만 현재 행의 값은 고정되어 있지 않다는 것입니다. 그리고 작업할 수 있는 "주" 열은 하나만 있습니다. 이전 시뮬레이션 값을 기반으로 진행 상황을 시뮬레이션하는 공식을 개발 중입니다. 이전 행을 기반으로 현재 행의 "주" 값을 시뮬레이션하고 있습니다.
"주" 열의 4행에서 작업 중이라고 가정해 보겠습니다. 함수에서 현재 "주" 값을 호출하지 않고 이전의 모든 "주" 값을 누적 합계하고 싶습니다. 그렇지 않으면 내 경우에는 잘못된 참조 또는 순환 문제가 발생합니다.
lag 함수가 현재 행의 "주" 값을 호출하기 때문에 lag 대신 아래 첨자를 사용해 보았습니다. 그것은 작동하지 않았다.
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
내 설명이 충분히 명확했으면 좋겠습니다. 귀하의 시간과 전문 지식에 미리 감사드립니다. 저는 JMP Pro 17을 사용합니다.
자동화 및 스크립팅예측 모델링 및 기계 학습Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.누적 합계에서 현재 주 값을 공제할 수 있습니다.
Col Cumulative Sum(:Week) - :Week

Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.안녕하세요. 저는 포럼을 통해 JSL 스크립트 작성과 강의 영상을 보면서 많은 것을 배우고 있습니다. 다음 스크립트와 관련하여 후속 질문이 있습니다. 두 번째 줄에서도 같은 결과를 얻었습니다. 왜 두 번째 줄 대신 첫 번째 줄을 선택하는지 알 수 있나요?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
또한 "R" 열을 수정하지 않고 원래 값을 유지하는 방법이 있습니까? 수정된 R 값이 어디에도 나타나지 않고 "Cases" 열 내부에 남아 있기를 원합니다. 아래와 같이 수정된 R에 "Rx"라는 다른 변수명을 할당해 보았습니다. 그러나 이 접근 방식을 사용하려면 "Rx"라는 빈 열을 만들어야 합니다.
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
귀하의 시간과 전문 지식에 미리 감사드립니다.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다."Sim Cases"는 데이터 테이블의 행렬인가요, 아니면 열인가요?
난 이해가 안 돼요
솔루션을 지나치게 복잡하게 만드는 것 같습니다.
sim cases = [3,5,2,8];
sum1 = sum(sim cases);
sum2 = sum(([1 1 1 1]*sim cases)[1]);
show(sum1,sum2);
sum1과 sum2 모두 동일한 값을 제공합니다.
sum1 = 18;
sum2 = 18;
도움말 풀다운 메뉴에서 제공되는 Discovering JMP 문서를 읽어 보시기 바랍니다.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.여기에 내 솔루션이 있지만 귀하의 솔루션과 일치하지 않습니다. 표시된 계산이 행 3에 대해 잘못된 것 같습니다. 샘플 데이터 테이블이 포함된 내 스크립트를 참조하세요.
Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 4 ),
New Column( "R",
Numeric,
"Continuous",
Set Values( [., 1.4, 1.67, 2.3] )
),
New Column( "Cases",
Expression,
"None",
Set Values( {[1, 1, 2, 1], Empty(), Empty(), Empty()} )
)
);
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) );
:R[i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * :R[i];
casesSum = casesSum + sum(casesMatrix);
);
// Row 3 R does not seem to be correct
// I can not come up with .71, I come up with .96192
show(1.4 * (1 - (5 * 4/100)) );
show(1.67 * (1 - (10.6 * 4/100)) );

Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.두 번째 라인이 훌륭하다고 제안하셨습니다. 내가 사용한 구문을 사용하는 이유는 단지 오래된 습관일 뿐입니다.
빈 열을 생성하지 않고 Rx를 사용할 수 있는 방법은 이를 메모리 변수 참조로 사용하는 것입니다. 이를 수행하는 코드는 다음과 같습니다.
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( casesMatrix = Expr( :cases[i - 1] ) );
Rx = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * Rx;
casesSum = casesSum + sum(casesMatrix);
);
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.수식에 (:Week)를 사용하는 순간 잘못된 참조 문제가 발생합니다. 현재 행(:Week)은 아직 완전히 계산되지 않았습니다. 이론적으로는 이전 행의 (:Week)만 기억할 수 있습니다.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.내가 올바르게 이해하고 있다면 이것이 해결책이 될 수 있다고 생각합니다.
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.모든 종류의 문제를 피하기 위해 별도의 열을 사용하겠지만, 예제에 전체 데이터가 있으므로 달성하려는 것이 무엇인지 정확히 모르겠습니다. Col Cumulative Sum이 작동하지 않는 경우 이와 유사한 것일 수 있습니다(지연 및 변수를 사용하여 값 계산).
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.색인 아래 첨자 사용에 대한 제안에 감사드립니다. 이제 "객체를 구독할 수 없습니다."라는 문제가 발생합니다.
내 주 예제는 지나치게 단순화되었으며 week 대신 4행과 1열의 Sim Cases 매트릭스가 있습니다. 하나의 요약된 숫자 값으로 변환하기 위해 행렬에 [1 1 1 1]을 곱하고 아래 첨자 [ 1 ]을 추가했습니다. 그 다음에는 Index 아래첨자가 따라왔습니다.
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
원래 4x1 행렬의 결과 숫자 값은 [ 1 ] 뒤에 어떤 첨자를 허용하지 않는 것 같습니다. 아니면 또 잘못된 참조(재귀) 때문일 수도 있습니다.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.네, 처음에는 열을 구분하여 Excel 스프레드시트에서 일반적으로 수행하는 작업을 JMP 데이터 테이블에서 에뮬레이트하려고 했습니다. 그런 다음 다른 열의 이전 행 값을 호출합니다. JMP 데이터 테이블이 Excel 스프레드시트처럼 작동하지 않고 주기적 문제가 발생합니다.
그래서 저는 계속해서 전략을 바꾸고 있으며 현재 제가 이해하고 있는 것은 순환 문제를 피하기 위해 모든 필수 변수를 하나의 열에 유지하는 것입니다.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.다시 안녕하세요. 나는 좌절감을 없앨 수 있기를 바라면서 내 질문을 다시 표현하고 있습니다.
| 열 | R | 사례 |
| 1 | . | [1, 1, 2, 1] |
| 2 | 1.4 | |
| 3 | 1.67 | |
| 4 | 2.3 | |
R 과 Cases 라는 2개의 열이 있습니다. 케이스는 현재 행의 R 과 이전 행의 케이스를 곱하여 계산됩니다. 또한 이전 행의 Cases 합을 기준으로 R을 수정(축소)해야 합니다.
Cases 열의 R (row2) = R (row2) * 수정자
수정자 = 1 - ( ( 1 행부터 현재 행 이전 행까지의 Case 누적 합계 * 4 ) / 총 모집단 )
총 인구는 매개변수이며 100입니다.
결과 수정자 에 row1의 Cases를 곱하여 row2에 Cases를 만듭니다.
예를 들어, 수정된 R (row2)이 예상됩니다. 1.12가 되고 사례 (row2)는 [1.12, 1.12, 2.24, 1.12]가 됩니다.
1.4 * 1 - ( 5 * 4 / 100 ) = 1.12
1.12 * [1, 1, 2, 1] = [1.12, 1.12, 2.24, 1.12]
그런 다음 수정된 R (row3)은 0.71이고 Cases (row3)는 [0.8, 0.8, 1.6, 0.8]이 될 것으로 예상합니다.
1.67 * 1 - ( 10.6 * 4 / 100 ) = 0.71
10.6은 행 1의 5 건과 행 2의 5.6 건에서 나온 것입니다.
0.71 * [1.12, 1.12, 2.24, 1.12] = [0.8, 0.8, 1.6, 0.8]
녹색 값을 얻는 데 문제가 있습니다. 현재 JMP 스크립트를 작성하려는 시도는 다음과 같습니다.
If( Row() == 1,
Matrix( {1, 1, 2, 1} ),
:R * (1 - (Summation( i = 1, N Row() - 1, Sum( :Cases ) ) * 4) / Total Population) * Lag( :Cases, 1 )
)
수정자를 얻기 위해 Index , Lag , Row() - 1 , Col cumulative sum , Summation 등을 시도했지만 아무것도 작동하지 않았습니다. 나는 주로 둘 중 하나를 얻습니다
1) 불법적인 참조 또는
2) 구독할 수 없음
귀하의 시간과 전문 지식에 다시 한 번 감사드립니다.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.매우 감사합니다. 여기서는 for 루프가 핵심인 것 같습니다. 저는 아직 Eval , Eval Expr , Expr 함수를 배우지 않았습니다.
그리고 당신 말이 맞아요. 이 예에서 제 계산은 틀렸어요.
Re: 현재 행의 값을 호출하지 않고 Col Cumulative Sum을 수행합니다.앞으로도 JMP를 계속 배우겠습니다. 지금은 Excel 스프레드시트만 사용하겠습니다. 귀하의 답변에 감사드립니다.
Sim Cases 는 열이며 새 행을 생성할 때 이전 행의 Sim Cases를 사용하고 있습니다. 그래서 나는 그것이 같은 열 안에 있는 열이자 변수라고 생각합니다.
Re: 현재 행의 값을 호출하지 않고 Col 누적 합계JMP 테이블과 스프레드시트의 동작 방식은 완전히 다르며, 이 오래된 게시물은 몇 가지 예와 설명을 제공하기 때문에 JMP는 스프레드시트가 아닙니다 . JMP에서 대부분의 작업을 수행할 수 있지만 JMP에서 열+행이 어떻게 동작하는지와 Excel에서 단일 셀이 어떻게 동작하는지 이해하는 데 시간이 걸릴 수 있습니다.
Re: 현재 행의 값을 호출하지 않고 Col 누적 합계를 구하는 방법이 스크립트는 txnelson의 솔루션을 시작점으로 삼고 몇 가지 수정을 가합니다. 이 스크립트의 목적은 다른 기법(For 루프 대신 For Each Row, :R에서 행렬로 값 가져오기, 기타 변경 사항)을 사용하여 학습할 수 있도록 다른 예제를 제공하는 것입니다.
Names Default To Here(1);
dt = New Table("Example",
Add Rows(4),
New Column("R", Numeric, "Continuous", Set Values([., 1.4, 1.67, 2.3])),
New Column("Cases", Expression, "None", Set Values({[1, 1, 2, 1], Empty(), Empty(), Empty()}))
);
r_m = :R << Get values;
casesSum = 0;
For Each Row(dt,
If(Row() == 1, Continue()); // skip first row
casesMatrix = Lag(:cases, 1);
r_m[Row()] = r_m[Row()] * (1 - (Sum(casesMatrix) + casesSum) * 4 / 100);
:Cases = casesMatrix * r_m[Row()];
casesSum = casesSum + Sum(casesMatrix);
);