SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />10개 열의 합계를 새 열로 계산하여 양수 값만 합산하려고 합니다. 마찬가지로 모든 음수 값을 합산하는 다른 열을 원합니다. Excel에서는 SUMIF: =SUMIF(A1:J1;">0") 함수를 사용합니다.
JMP에서 비슷한 작업을 수행하려면 어떻게 해야 합니까?
Excel의 간단한 예를 사용하여(분명히 내 데이터 세트가 더 크지만) 이것이 내가 목표로 하는 것입니다.
| ㅏ | 비 | 씨 | 디 | 양의 합계 | 음수 합계 |
| 1,00 | 2,00 | -7,00 | 5,00 | 8,00 | -7,00 |
| 4,00 | 64,00 | 55,90 | 5,20 | 129,10 | 0,00 |
| 86,10 | -34,44 | 5,60 | 7,21 | 98,91 | -34,44 |
| 6,00 | 8,00 | -96,00 | 6,00 | 20,00 | -96,00 |
| 1,00 | -8,00 | 5,00 | 0,64 | 6,64 | -8,00 |
도움을 주셔서 감사합니다!
얀네
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?맙소사, 멋지네요!
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?위의 Brady 게시물에 있는 것과 같은 간단하고 영리한 열 수식을 좋아합니다. 그러나 예, 그들은 종종 테이블 크기에 따라 크게 확장됩니다.
대안은 먼저 모든 행에서 전체 행렬을 가져오지 않고 현재 행을 직접 가져오는 열 공식에 대한 것입니다. 아래 공식은 이에 대한 시도입니다.
Brady의 JSL 코드나 Ian의 열에 대한 명시적 합계만큼 빠르지는 않지만 훨씬 빠릅니다. 더 나은 확장성(다소 선형적으로) 테이블 크기 ), 의존하는 공식보다 dt< . 10000x4 테이블의 경우 랩톱에서 실행하는 데 약 0.2초가 걸립니다.
이 예는 또한 수식을 동적으로 작성하는 대신 로컬 변수를 사용하여 수식을 일반화하는 대체 방법을 보여줍니다. 될 수 있는 도전 . (이 예에서는 수식 열이 항상 마지막 열로 남아 있다고 가정합니다).
//예제 테이블
dt = 새 테이블 ( "열 간 조건 합계" , 행 추가 ( 10000 )) ;
을 위한 ( 나 = 1 , 나 <= 4 , 나 ++,
dt << 새 열 ( "엑스" , 숫자 , 공식 ( 랜덤 노멀 ( 0 , 1 )))
) ;
dt << 열 삭제 ( 1 ) ;
// 모든 열에 조건부 합계 추가
dt << 새 열 ( "양수 합계" ,
숫자 ,
공식 (
현지의 ({ 나 = 0 , N = N 열 ( 현재 데이터 테이블 ()) - 1 } ,
합집합 ( 반복하다 ({ 나 ++ ; 열 ( 나 )[] * ( 열 ( 나 )[] > 0 )} , N ))
)
)
) ;
dt << 새 열 ( "마이너스 썸" ,
숫자 ,
공식 (
현지의 ({ 나 = 0 , N = N 열 ( 현재 데이터 테이블 ()) - 2 } ,
합집합 ( 반복하다 ({ 나 ++ ; 열 ( 나 )[] * ( 열 ( 나 )[] < 0 )} , N ))
)
)
) ;
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?Brady가 이미 말했듯이 '수식' 측면(새 행을 추가하고 결과를 자동으로 얻을 수 있음)을 무시할 수 있다면 행렬 접근 방식이 훨씬 더 잘 확장됩니다.
그러나 수식 열을 동적으로 생성하려는 경우 다음과 같이 표시됩니다.
NamesDefaultToHere ( 1 ) ;
// 6개의 소스 열이 있는 테이블
dt = 새 테이블 ( "열의 합계" ,
새 열 ( "열 1" , 숫자 , "마디 없는" , 체재 ( "고정 12월" , 10 , 삼 ) , 공식 ( 랜덤 노멀 ( 0 , 1 ) ) ) ,
새 열 ( "열 2" , 숫자 , "마디 없는" , 체재 ( "고정 12월" , 10 , 삼 ) , 공식 ( 랜덤 노멀 ( 0 , 1 ) ) ) ,
새 열 ( "열 3" , 숫자 , "마디 없는" , 체재 ( "고정 12월" , 10 , 삼 ) , 공식 ( 랜덤 노멀 ( 0 , 1 ) ) ) ,
새 열 ( "열 4" , 숫자 , "마디 없는" , 체재 ( "고정 12월" , 10 , 삼 ) , 공식 ( 랜덤 노멀 ( 0 , 1 ) ) ) ,
새 열 ( "열 5" , 숫자 , "마디 없는" , 체재 ( "고정 12월" , 10 , 삼 ) , 공식 ( 랜덤 노멀 ( 0 , 1 ) ) ) ,
새 열 ( "열 6" , 숫자 , "마디 없는" , 체재 ( "고정 12월" , 10 , 삼 ) , 공식 ( 랜덤 노멀 ( 0 , 1 ) ) ) ,
행 추가 ( 10 )
) ;
// 열 목록(여러 열이 될 수 있음!)
cList = dt << getColumnNames ;
// 'negative sum' 수식 표현식 작성
col기여 = 만료 ( 콜미정 * 만약에 ( 콜미정 < 0 , 1 , 0 )) ;
formArg = 만료 ( 추가하다 ()) ;
을 위한 ( 씨 = 1 , 씨 <= N항목 ( cList ) , 씨 ++,
thisCol기여 = NameExpr ( 대리자 ( NameExpr ( col기여 ) , 만료 ( 콜미정 ) , EvalExpr ( AsColumn ( cList [ 씨 ])))) ;
에 집어 넣다 ( formArg , thisCol기여 ) ;
) ;
nsExpr = 만료 ( 공식 ( fTBD )) ;
대체 ( nsExpr , 만료 ( fTBD ) , NameExpr ( formArg )) ;
// 인쇄(nsExpr);
// 'positive sum' 수식 표현식 작성
col기여 = 만료 ( 콜미정 * 만약에 ( 콜미정 >= 0 , 1 , 0 )) ;
formArg = 만료 ( 추가하다 ()) ;
을 위한 ( 씨 = 1 , 씨 <= N항목 ( cList ) , 씨 ++,
thisCol기여 = NameExpr ( 대리자 ( NameExpr ( col기여 ) , 만료 ( 콜미정 ) , EvalExpr ( AsColumn ( cList [ 씨 ])))) ;
에 집어 넣다 ( formArg , thisCol기여 ) ;
) ;
psExpr = 만료 ( 공식 ( fTBD )) ;
대체 ( psExpr , 만료 ( fTBD ) , NameExpr ( formArg )) ;
// 인쇄(psExpr);
// 두 수식 열을 dt에 추가
nsCol = dt << NewColumn ( "음수의 합" , 숫자 , 마디 없는 , 체재 ( "고정 12월" , 10 , 삼 )) ;
makeFormula = 만료 ( 보내다 ( nsCol )) ;
에 집어 넣다 ( makeFormula , NameExpr ( nsExpr )) ;
makeFormula ;
psCol = dt << NewColumn ( "긍정의 합" , 숫자 , 마디 없는 , 체재 ( "고정 12월" , 10 , 삼 )) ;
makeFormula = 만료 ( 보내다 ( psCol )) ;
에 집어 넣다 ( makeFormula , NameExpr (피 sExpr )) ;
makeFormula ;
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?Brady의 결과는 Ian의 결과와 일치하지만 다음 행을 변경해야 합니다. 중 = ( dt << 매트릭스로 가져오기 )[ 0 , 1 :: 4 ] ;
이에: 중 = ( dt << 매트릭스로 가져오기 )[ 0 , 1 :: 삼 ] ;
Ian이 생성하는 테이블에는 3개의 열만 있는 반면 Brady의 예는 4개의 열에 대한 것입니다.
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?이안과 브래디에게,
친절하고 빠른 도움을 주셔서 감사합니다!!! 나는 두 가지 접근 방식을 모두 시도했고 어떻게 든 두 가지 다른 결과를 얻었습니다 :-(.
몇 가지 예를 수동으로 테스트하여 Ian의 접근 방식이 올바른 결과를 제공하는 반면 Brady의 스크립트는 훨씬 더 큰 합계를 반환한다는 것을 알았습니다. 이유를 모르겠고 불행히도 저는 여전히 JMP 초보자이므로 무엇이 잘못되었는지 알 수 없습니다. 그러나 Ian의 접근 방식이 잘 작동하는 것 같았기 때문에 나는 그 방식을 고수하기로 결정했습니다(공식은 10열에 대해 상당히 길어지지만).
도와주셔서 감사합니다!!!
(그리고 100개의 열에 이 기능이 필요하다면 그때쯤 JMP에 SUMIF 기능이 있기를 바랍니다.
)
건배,
얀네
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?Ian이 언급했듯이 이것은 많은 열에서 다루기 어려울 수 있습니다. 공식이 정말로 필요하지 않은 경우(즉, 소스 열이 변경되지 않음) 현재 원하는 데이터 테이블로 다음 JSL을 실행하여 모든 행에 대해 신속하게 수행할 수 있습니다(코드는 숫자가 열 1-4에 있다고 가정합니다) , 코드의 2행에 있는 색인에 따라... 필요에 따라 변경하되 연속적으로 유지하십시오.)
dt = 현재 데이터 테이블 () ;
중 = ( dt << 매트릭스로 가져오기 )[ 0 , 1 :: 4 ] ;
dt << 새 열 ( "양수 합계" , << 값 설정 ( vsum ( 에멀트 ( 중 > 0 , 중 ) ` ) ` )) ;
dt << 새 열 ( "마이너스 썸" , << 값 설정 ( vsum ( 에멀트 ( 중 < 0 , 중 ) ` ) ` )) ;
수식이 필요한 경우 다음을 사용할 수 있습니다(편집기에 복사/붙여넣기하는 것이 가장 좋음). 이는 간단하지만 각 행에 대한 전체 행렬을 가져오고 있기 때문에 테이블이 매우 커짐에 따라 더 느리게 실행됩니다. (음의 합계에 대한 부등식을 변경합니다.
연산자는 위의 emult() 함수에서 사용된 요소별 곱셈입니다.)
dt = 현재 데이터 테이블 () ;
중 = ( dt << getasmatrix )[ 열 () , 색인 ( 1 , 4 )] ;
합집합 ( ( 중 > 0 )
중 ) ;
여기서 장단점은 성능 제한에도 불구하고 기능이 진행됨에 따라 매우 짧고 간단하며 더 많은 열을 추가하면 쉽게 변경할 수 있다는 것입니다. 그래도 비교적 작은 테이블에서만 사용하겠습니다. 그렇지 않으면 Ian이 제안한 것과 같은 것을 사용하는 것이 가장 좋습니다.
10,000행 x 4열 난수 테이블에 대해 설명하는 두 가지 접근 방식을 비교하면 다음과 같습니다.
스크립트 접근: 0.002713초
수식 접근: 6.050183초
스크립트 방식은 10,000,000행 x 4열 테이블에서 3초밖에 걸리지 않습니다. 1,000,000개의 행 테이블에 대해서만 1시간 후에 수식 접근 방식 실행을 중지했습니다. 공식 조각이 필요한지, 아니면 스크립트를 테이블에 저장하고 필요에 따라 실행할 의향이 있는지 여부에 달려 있습니다. 그렇다면 상당한 성능상의 이점을 얻을 수 있습니다.
건배,
브래디
Re: SUMIF: 여러 열에서 조건부 합계를 구하는 방법은 무엇입니까?다음 표와 같은 접근 방식을 사용할 수 있습니다.
새 테이블 ( "열의 합계" ,
행 추가 ( 0 ) ,
새 열 ( "열 1" ,
숫자 ,
"마디 없는" ,
체재 ( "고정 12월" , 10 , 삼 ) ,
공식 ( 랜덤보통 ( 0 , 1 ))
) ,
새 열 ( "열 2" ,
숫자 ,
"마디 없는" ,
체재 ( "고정 12월" , 10 , 삼 ) ,
공식 ( 랜덤보통 ( 0 , 1 ))
) ,
새 열 ( "열 3" ,
숫자 ,
"마디 없는" ,
체재 ( "고정 12월" , 10 , 삼 ) ,
공식 ( 랜덤보통 ( 0 , 1 ))
) ,
새 열 ( "긍정의 합" ,
숫자 ,
"마디 없는" ,
체재 ( "고정 12월" , 10 , 삼 ) ,
공식 (
: 열 1 * 만약에 ( : 열 1 >= 0 , 1 , 0 ) + : 열 2 *
만약에 ( : 열 2 >= 0 , 1 , 0 ) + : 열 3 * 만약에 ( : 열 3 >= 0 , 1 , 0 )
)
) ,
새 열 ( "음수의 합" ,
숫자 ,
"마디 없는" ,
체재 ( "고정 12월" , 10 , 삼 ) ,
공식 (
: 열 1 * 만약에 ( : 열 1 < 0 , 1 , 0 ) + : 열 2 *
만약에 ( : 열 2 < 0 , 1 , 0 ) + : 열 3 * 만약에 ( : 열 3 < 0 , 1 , 0 )
)
) ,
행 추가 ( 10 )
);
열이 많으면 필요한 '합' 열을 프로그래밍 방식으로 빌드하는 것이 더 쉬울 수 있습니다.
Re: SUMIF: 열 전체에서 조건부 합을 구하는 방법은 무엇입니까?안녕하세요,
이것은 현재 작업에 매우 유용한 스크립트입니다.
값이 "0/0"인 열에 효과적입니다.
dt << 새 열("합계",숫자, 수식(
Local({i = 0, n = N Col(현재 데이터 테이블()) - 1},Sum(Repeat({i++ ; (Column(i)[] =="0/0")}, n))) )));
그러나 "some_character"를 포함하는 열에 대해 어떻게 편집하고 해당 열의 수를 계산해야 합니까?
필요한 수식이 있는 마지막 열 "Sum"이 포함된 데이터 테이블을 첨부했습니다.
빅 데이터 테이블이 있고 특정 값이 있는 열을 계산하는 스크립트를 갖고 싶습니다.
감사합니다,
부사장