두 테이블을 함께 곱하는 방법빅 데이터 테이블과 정규화 계수 테이블이 있습니다.
데이터 테이블은 다음과 같습니다.
| 신분증 | 유형 | parameter1 | parameter2 | parameter3 |
| 01 | 1 | 데이터 | 데이터 | 데이터 |
| 02 | 1 | 데이터 | 데이터 | 데이터 |
| 03 | 2 | 데이터 | 데이터 | 데이터 |
| 04 | 2 | 데이터 | 데이터 | 데이터 |
정규화 계수 테이블은 다음과 같습니다.
| 유형 | parameter1 | parameter2 | parameter3 |
| 1 | 정규화 요소 1 | 정규화 계수 2 | 정규화 요인 3 |
| 2 | 정규화 요소 4 | 정규화 factor5 | 정규화 factor6 |
유형과 매개 변수에 따라 첫 번째 테이블에 두 번째 테이블을 곱하고 다음과 같은 새 테이블을 얻으려면 어떻게해야합니까?
| 신분증 | 유형 | parameter1 | parameter2 | parameter3 |
| 01 | 1 | data * normalization factor1 | data * normalization factor2 | data * normalization factor3 |
| 02 | 1 | data * normalization factor1 | data * normalization factor2 | data * normalization factor3 |
| 03 | 2 | data * normalization factor4 | data * normalization factor5 | data * normalization factor6 |
| 04 | 2 | data * normalization factor4 | data * normalization factor5 | data * normalization factor6 |
내 원시 데이터 테이블은 행과 열이 모두 커서 빠른 솔루션을 원합니다.
대단히 감사합니다.
데이터 테이블스크립팅Re : 두 테이블을 함께 곱하는 방법가상 조인 및 수식 열을 사용할 수 있습니다.
가상 조인은 파란색과 금색 키를 추가합니다.
대화식으로 또는 JSL과 연결할 수 있습니다.
이것은 JMP16 이름을 : "parameter3 [유형]"n 통사론; 이름이 필요할 수 있습니다 ( "parameter3 [유형]" ) 대신.
// 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>
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 : 두 테이블을 함께 곱하는 방법당신의 답변에 감사드립니다. 그러나 열이 많고 열 이름이 복잡합니다. 따라서 새로운 열을 만들기 위해 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 : 두 테이블을 함께 곱하는 방법감사합니다. 작은 데이터 세트에서 작동합니다. 하지만 표 1에는 수백만 개의 행이 있고 표 2에는 두 개의 행만 있습니다. 따라서 다른 거대한 테이블을 만드는 것을 피하고 싶습니다. 더 나은 해결책을 찾을 수 없다면이 방법을 시도해 보겠습니다.
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 ()를 사용하십시오.
- << RunFormulas는 속도에 중요합니다. 열 수식의 기본 백그라운드 평가가 훨씬 느립니다.