두 테이블을 어떻게 곱합니까?빅데이터 테이블과 정규화 인자 테이블이 있습니다.
데이터 테이블은 다음과 같습니다.
| ID | 유형 | 매개변수1 | 매개변수2 | 매개변수3 |
| 01 | 1 | 데이터 | 데이터 | 데이터 |
| 02 | 1 | 데이터 | 데이터 | 데이터 |
| 03 | 2 | 데이터 | 데이터 | 데이터 |
| 04 | 2 | 데이터 | 데이터 | 데이터 |
정규화 인자 테이블은 다음과 같습니다:
| 유형 | 매개변수1 | 매개변수2 | 매개변수3 |
| 1 | 정규화 인자1 | 정규화 인자2 | 정규화 인자3 |
| 2 | 정규화 인자4 | 정규화 인자5 | 정규화 인자6 |
유형 및 매개변수를 기반으로 첫 번째 테이블에 두 번째 테이블을 곱하고 다음과 같은 새 테이블을 얻으려면 어떻게 해야 합니까?
| ID | 유형 | 매개변수1 | 매개변수2 | 매개변수3 |
| 01 | 1 | 데이터*정규화 인자1 | 데이터*정규화 인자2 | 데이터*정규화 인자3 |
| 02 | 1 | 데이터*정규화 인자1 | 데이터*정규화 인자2 | 데이터*정규화 인자3 |
| 03 | 2 | 데이터*정규화 인자4 | 데이터*정규화 인자5 | 데이터*정규화 인자6 |
| 04 | 2 | 데이터*정규화 인자4 | 데이터*정규화 인자5 | 데이터*정규화 인자6 |
내 원시 데이터 테이블은 행과 열 모두 크기 때문에 빠른 솔루션이 필요합니다.
매우 감사합니다.
고급 통계 모델링소비자 및 시장 조사대량 맞춤화품질 및 프로세스 엔지니어링Re: 두 테이블을 어떻게 곱하나요?여기에 예가 있습니다.
mat1 = [ 1 2 3, 4 5 6, 7 8 9, 10 11 12];
mat2 = [1 2 3 4, 5 6 7 8, 9 10 11 12];
finalMat = mat1 * mat2;
다음은 데이터가 데이터 테이블에 있는 예입니다.
names default to here(1);
dt1 = data table("one");
dt2 = data table("two");
finalMat=dt1[0,0]*dt2[0,0];Re: 두 테이블을 어떻게 곱하나요?안녕
예를 들어 첫 번째 행렬은 3X4 행렬이고 두 번째 행렬은 4X2 행렬입니다. JMP Pro 16에서 이 행렬 곱셈을 수행하는 방법을 제안할 수 있는 사람이 있습니까?
Re: 두 테이블을 어떻게 곱하나요?업데이트해 주셔서 감사합니다. 시도해 보았는데 평가판 데이터 세트에서 작동합니다. 그러나 다른 사람이 지적한 대로 성능 문제가 발생합니다. 그러므로 나는 그의 대답을 최선의 해결책으로 받아들였습니다.
Re: 두 테이블을 어떻게 곱하나요?안녕,
나는 이것을 보고 테이블이 당신의 크기에 가까워지자 성능 벽을 발견했습니다(실제로는 그보다 훨씬 이전에). 테이블을 약 10K의 "블록"으로 처리하기 시작하자 상황이 조금 개선될 수 있었습니다. 행을 1,000개 열로 늘립니다. 크기를 조정하여 무엇이 가장 잘 작동하는지 확인할 수 있지만 이러한 크기는 잘 작동하는 것 같습니다.
이 방법은 새 테이블을 생성하지 않습니다. 원본을 덮어쓰므로 원본을 저장한 다음 결과를 다른 이름으로 저장해야 합니다.
아래 스크립트는 전반적인 개념을 설명하기 위한 것이므로 몇 가지 가정을 합니다.
- 해당 열은 각 테이블에서 동일한 순서로 되어 있습니다.
- p 매개변수의 경우 기본 테이블에는 p+2 열이 있고 요인 테이블에는 p+1 열이 있습니다. 두 테이블 모두에 다른 열이 없습니다.
실제 처리 1000개의 열이 있는 100만 행 테이블의 시간은 약 40초였습니다. 각 "블록"을 처리하는 데 약 0.3 - 0.4초가 걸렸습니다.
가지고 있는 테이블을 조롱하기 위한 테이블 설정 부분에는 시간이 좀 걸렸습니다. 아마도 몇 분 정도 걸릴 것입니다. 현재 스크립트는 더 작은 테이블에 대해 설정되어 있습니다. 이를 변경하려면 //table settings 주석 아래 줄을 수정하세요.
코드는 우아하지도 콤팩트하지도 않지만 내가 생각해낼 수 있는 다른 어떤 것보다 빠르게 실행됩니다(전체 블록에서 요소별 곱셈을 한 번에 사용하는 것을 포함하여... 어떤 이유로든 열을 반복하는 데 약 절반의 시간이 걸렸습니다. ) 하지만 나는 Craige의 공식 기반 접근 방식을 시도하지 않았습니다.
where()를 사용하여 행을 가져오지 않으려면 초기 정렬이 필요합니다. 그렇게 해야 하면 속도가 상당히 느려집니다.
건배,
브래디
Names Default To Here( 1 );
//set limits on block size
blockRowLimit = 1e4;
blockColLimit = 1e3;
// table setup
rowsdt1 = 1e4;
colsdt1 = 1e2;
dt1 = As Table( (1 :: rowsDt1)` || J( rowsDt1, 1, Random Integer( 1, 2 ) ) || J( rowsdt1, colsdt1, Random Uniform() ), <<INVISIBLE></INVISIBLE>
Re: 두 테이블을 어떻게 곱하나요?루프는 쉽지 않습니다. 나는 이것이 그것을 할 것이라고 생각합니다 :
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
originalColumns = dataDT<<GETCOLUMNNAMES></GETCOLUMNNAMES>
- 가상 조인을 사용하여 숨겨진 열을 추가하기 전에 원래 열을 캡처합니다.
- 포함된 따옴표를 이스케이프하려면 \!"를 사용하여 표현식 e를 작성하십시오.
- 인쇄가 아닌 작업을 디버그하려면 write()를 사용하세요.
- <
Re: 두 테이블을 어떻게 곱하나요?감사합니다. 작은 데이터 세트에서 작동합니다. 하지만 테이블 1에는 수백만 개의 행이 있고 테이블 2에는 단 두 개의 행만 있습니다. 그러므로 나는 또 다른 거대한 테이블을 만드는 것을 피하고 싶습니다. 더 나은 해결책을 찾을 수 없으면 이 방법을 시도해 보겠습니다.
Re: 두 테이블을 어떻게 곱하나요?당신의 답변에 감사드립니다. 그런데 컬럼이 많아 컬럼명이 복잡합니다. 따라서 새 열을 생성하기 위해 for 루프를 작성하고 싶습니다. 이 진술에 대해 더 자세히 설명해주실 수 있나요?
Formula( :"parameter1[Type]"n * :parameter1 )
다음과 같이 for 루프를 작성하려고 합니다.
</CODE></PRE><PRE class="lia-code-sample language-markup"><CODE>colnames = dataDT << Get Column Names();
nc = ncols(dataDT);
DT = New Table("normalized", New Column("ID", values(dataDT:ID << get values)),
New Column("Type", values(dataDT:Type << get values)));
For(i = 3, i<= nc, i++,
DT << New Column( char( colnames[3]), Numeric, "Continuous", Format( "Best", 12 ), Formula( XXXX ) ));하지만 공식을 올바르게 구성하는 방법을 모르겠습니다. . 계속해서 오류가 발생합니다. 도와주세요?
감사합니다.
Re: 두 테이블을 어떻게 곱하나요?그리고 공식이 필요하지 않은 경우 '더 나을' 수도 있고 그렇지 않을 수도 있는 행렬의 요소별 곱셈을 고려할 수 있습니다. 내 MacBook에서는 아래 코드가 약 15초 정도 걸렸습니다.
NamesDefaultToHere(1);
nr = 10000; // Number of rows
nc = 10000; // Number of Columns
dt1 = AsTable(J(nr, nc, RandomInteger(1, 20)));
dt2 = AsTable(J(nr, nc, RandomUniform(0, 1)));
m1 = dt1 << getAsMatrix;
m2 = dt2 << getAsMatrix;
dtFinal = AsTable(m1 :*</img> m2);
Re: 두 테이블을 어떻게 곱하나요?가상 조인 및 수식 열을 사용할 수 있습니다.
Virtual join adds the blue and gold keysVirtual join adds the blue and gold keys가상 조인은 파란색과 금색 키를 추가합니다.
대화형으로 또는 JSL을 사용하여 연결할 수 있습니다.
이는 다음과 같은 JMP16 이름을 사용하고 있을 수 있습니다. :"매개변수3[유형]"n 통사론; 이름이 필요할 수도 있습니다( "매개변수3[유형]" ) 대신에.
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
// join the tables
factorDT:type << Set Property( "Link ID", 1 );
dataDT:type << Set Property( "Link Reference", Reference Table( "factor.jmp" ) );
// add formula columns
dataDT << New Column( "p 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter1[Type]"n * :parameter1 ) );
dataDT << New Column( "p 2", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter2[Type]"n * :parameter2 ) );
dataDT << New Column( "p 3", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter3[Type]"n * :parameter3 ) );
// force the evaluation to complete
dataDT<<RUNFORMULAS></RUNFORMULAS>