안녕하세요, 스크립팅에 문제가 있는 다음 과제가 있습니다.
내 시작 데이터 테이블은 아래와 같습니다. col2 =0부터 시작하여 Xi를 역방향으로 곱하고 새 값을 새 열에 넣고 싶습니다.
열1 열2
X1 0
X2y2
X3y3
…
Xn yn
XX1 0
XX2년2년
....
XXn yyn
....
....
내 최종 데이터 테이블은 다음과 같습니다.
열1 열2 열3
X1 0 Xn*Xn-1*……X3*X2*X1
X2 y2 Xn*Xn-1*…..X3*X2
X3 y3 Xn*Xn-1*….*X3
…
Xn yn Xn
XX1 0 XXn*XXn-1*…..XX2*XX1
XX2년 2년 XXn*XXn-1*…..XX2
....
XXn yyn XXn
....
....
누군가 도와 주시겠습니까? 대단히 감사합니다!
원하는 계산은 데이터가 반전되면 매우 쉽게 수행할 수 있으므로 여기에 그 아이디어를 사용하여 값을 계산하는 작은 스크립트가 있습니다.
names default to here(1);
// create the sample table
dt = New Table( "example",
Add Rows( 10 ),
New Column( "col1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 2, 4, 5, 6, 7, 8, 9] ),
Set Display Width( 48 )
),
New Column( "col2",
Character( 1 ),
"Nominal",
Set Values( {"x", "x", "x", "y", "y", "y", "y", "z", "z", "z"} ),
Set Display Width( 45 )
)
);
// JSL to create the column you want
// create a new column to preserve the order of the data
dt << new column("origRow", formula(row()));
dt:origRow << delete formula;
// Reverse the order of the data
dt << sort(by(:origRow), order(descending), replace table(1));
// create the new column
dt << new column( "col3", formula(
If( Row() == 1, x = :col1 );
If( Lag( :col2 ) != :col2,
x = :col1,
x = x * :col1
);
x;
));
// Since the formula is dependent on the order of the data, the formula needs
// to be removed and the values set to static values
dt:col3 << delete formula;
// reorder the data table back to the original order and delete the origRow column
dt << sort(by(:origRow), order(ascending), replace table(1));
dt << delete columns(:origRow);
다음은 정렬하지 않고 새 열을 생성하는 JSL입니다.
Names Default To Here( 1 );
// create the sample table
dt = New Table( "example",
Add Rows( 10 ),
New Column( "col1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 2, 4, 5, 6, 7, 8, 9] ),
Set Display Width( 48 )
),
New Column( "col2",
Character( 1 ),
"Nominal",
Set Values( {"x", "x", "x", "y", "y", "y", "y", "z", "z", "z"} ),
Set Display Width( 45 )
)
);
// create the new column
dt << New Column( "col3b" );
:col3b[N Rows( dt )] = :col1[N Rows( dt )];
For( i = N Rows( dt ) - 1, i >= 1, i--,
If( :col2[i + 1] != :col2[i],
:col3b[i] = :col1[i],
:col3b[i] = :col3b[i + 1] * :col1[i]
)
);
안녕 짐 @txnelson
그것은 실제로 더 작은 테이블(예: 수천 행)에서 작동했습니다. 감사합니다.
내가 겪고 있는 '새로운' 문제는 내 데이터 테이블이 매우 크다는 것입니다. 수식을 새 열에 삽입하고 '적용'을 클릭하면 프로그램이 중단되고 나가기 위해 jmp를 종료해야 했습니다.
수식 위로 마우스를 가져가면 '현재 데이터 테이블'에 대한 경고 메시지가 표시됩니다.
"현재 데이터 테이블()에는 부작용이 있으며 일반적으로 수식 내에서 사용하기에 부적절합니다. 이것이 필요한 경우 expr 또는 eval을 사용하여 수식에서 실행을 방지할 수 있습니다....."
내 스크립팅 기술은 매우 제한적입니다. 이 주제에 대한 귀하의 추가 도움에 감사드립니다!
문안 인사,
팅후이
@txnelson 쓴 :
여기에 새로운 공식이 있습니다....마지막 공식과 동일한 방법이지만 각 그룹의 시작점과 끝점을 찾으면 됩니다.
If( Row() == 1,
curCol = :col2;
end = Max( Current Data Table() << get rows where( :col2 == curCol ) );
x = :col1;
,
:col2 != curCol;
curCol = :col2;
end = Max( Current Data Table() << get rows where( :col2 == curCol ) );
x = :col1;
);
For( i = Row() + 1, i <= end, i++,
x = x * :col1[i]
);
x;
여기에 새로운 공식이 있습니다....마지막 공식과 동일한 방법이지만 각 그룹의 시작점과 끝점을 찾으면 됩니다.
If( Row() == 1,
curCol = :col2;
end = Max( Current Data Table() << get rows where( :col2 == curCol ) );
x = :col1;
,
:col2 != curCol;
curCol = :col2;
end = Max( Current Data Table() << get rows where( :col2 == curCol ) );
x = :col1;
);
For( i = Row() + 1, i <= end, i++,
x = x * :col1[i]
);
x;

안녕 짐 @txnelson
답장을 보내 주셔서 감사합니다.
아니요, 열 이름은 변경되지 않습니다. 그들은 주어진대로 col1, col2로 유지됩니다.col2에 주어진 동일한 값에 대해 역방향 곱셈을 수행하는 새 열(col3)을 추가하고 싶습니다. 다음 표에서 내 필요를 보여주고 있습니다.도와주시겠어요?
열1 열2 열3
1 x 6(예: 1 x 2 x 3)
2 x 6(예: 2 x 3)
3 x 3(예: 3)
2년 240(예: 2x4x5x6)
4년 120(예: 4 x 5 x6)
5년 30(예: 5 x6)
6년 6년(예: 6)
7z 504(예: 7x8x9)
8z 72(예: 8x9)
9z9
감사해요!
그룹화 변수를 놓쳤기 때문에 게시물을 삭제했습니다. 내 접근 방식은 이 시나리오에서 작동하지 않습니다.
나는 당신의 3 세트의 열을 이해하지 못합니다.데이터 테이블 중간에서 열 이름을 변경하는 것처럼 보이지만 JMP에서는 작동하지 않습니다.이 테이블 형식은 Excel 스프레드시트에서 가져옵니까?
다음은 다음과 같은 데이터 테이블에 대해 원하는 작업을 수행하는 간단한 수식입니다.

데이터 테이블을 첨부했습니다.
사용된 공식은 다음과 같습니다.
x = :col2[Row()];
If( Row() < N Rows( Current Data Table() ),
For( i = Row() + 1, i <= N Rows( Current Data Table() ), i++,
x = x * :col2[i]
)
);
x;
곱하기를 다시 시작해야 하는 데이터 테이블에 여러 위치가 있는 경우 이와 동일한 아이디어를 사용할 수 있습니다.재시작 시점과 종료 시점을 식별해야 합니다.