안녕,
간단히 말해 JMP 형식 WIDE에서 LONG으로 변환하면 됩니다.
BIG CLASS를 사용하여 기본 아이디어를 설명하겠습니다.
dt = Open( "$SAMPLE_DATA/big class.jmp" );
기본 목표: BEFORE 구조
NAME AGE SEX HEIGHT WEIGHT
KATIE 12 F 59 95
LOUISE 12 F 61 123
JANE 12 F 55 74
JACLYN 12 F 66 145
구조 AFTER(이름과 SEX를 ID로 봅시다)
...NAME SEX SOURCE_COL VALUE
KATIE F AGE 12
LOUISE F AGE 12
JANE F AGE 12
JACLYN F AGE 12
KATIE F HEIGHT 59
LOUISE F HEIGHT 61
JANE F HEIGHT 55
JACLYN F HEIGHT 66
KATIE F WEIGHT 95
LOUISE F WEIGHT 123
JANE F WEIGHT 74
JACLYN F WEIGHT 145
이제 "트위스트" 부분이 나옵니다.불행히도 인생은 복잡합니다.
또한 데이터 상황은 좀 더 복잡합니다. 원래 BIG CLASS 콘텐츠에 가상의 행이 추가되었습니다..
BEFORE 데이터 세트 구조
NAME AGE SEX HEIGHT WEIGHT
KATIE 12 F 59 95
KATIE 12 F 61 105 <-
LOUISE 12 F 61 123
JANE 12 F 55 74
JANE 12 F 65 84 <-
JACLYN 12 F 66 145
임시 처리(행 집계)
NAME AGE SEX HEIGHT WEIGHT NO_ROWS
KATIE 12 F 60 100 2
LOUISE 12 F 61 123 1
JANE 12 F 60 79 2
JACLYN 12 F 66 145 1
구조 데이터셋 AFTER(NAME 및 SEX를 ID로 봅시다)
NAME SEX SOURCE_COL VALUE
KATIE F AGE 12 1
LOUISE F AGE 12 1
JANE F AGE 12 1
JACLYN F AGE 12 1
KATIE F HEIGHT 60 <- 2
LOUISE F HEIGHT 61 1
JANE F HEIGHT 60 <- 2
JACLYN F HEIGHT 66 1
KATIE F WEIGHT 95 1
LOUISE F WEIGHT 123 1
JANE F WEIGHT 79 <- 2
JACLYN F WEIGHT 145 1
BIG CLASS를 기반으로 JSL 코드를 작성했습니다. 첫 번째 행은 작동하지만 이후 행에 대해서는 지원해 주셔서 감사합니다.
귀하의 편의를 위해 관련된 논리적 단계를 제공했습니다. (1)에서 (5)까지를 참조하십시오.
//*********************************************************///
// Create example data tables to be used in the merging
names default to here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
ColmName = dt << get column names(character, numeric);
show(ColmName) ;
For( i = 4, i <= N Cols( dt ), i++,
current data table(dt);
dt2 = dt << subset( selected rows( 0 ), columns( :NAME, :SEX, Column( i ) ) ));
dt2 << New Column( "SOURCE_VOL", character, set each value(Column( i )) ) ;
Column( dt2, 3) << set name( "Value" );
wait(0);
// (1) Get all of the character columns for concatenating
ColmName = dt << get column names(character, numeric);
show(ColmName) ;
// (2) Splitting in subsets per column, e.g. one for AGE, then HEIGHT, then WEIGHT //
BIG_CLASS_(ColmName[1]) = BIG_CLASS << Subset(all rows, columns(:NAME, AGE (:Name(:ColmName[1])) ), Output Table Name("BIG_CLASS_(ColmName[1])") ) ;
// (3) Adding level info to every subset //
BIG_CLASS_(ColmName[1]) << new column("SOURCE_VOL", Character, Nominal, set each value("ColmName[1]");
imo_pick_1 = :"ColmName[1]" << set name ("Value") ;
// (4) Aggregate per subset //
BIG_CLASS_sub_(ColmName[1]) = BIG_CLASS_(ColmName[1]) <<
Summary( Group(:NAME, :SEX),
sum( :AGE ),
Link to original data table( 0 ),
Freq( "None" ),
Weight( "None" )
);
// (5) Concatenate allsubsets to build LONG data structure //
BIG_CLASS_demo =Data Table(BIG_CLASS_sub_(ColmName[1])) <<
Concatenate(
Data Table( "BIG_CLASS_sub_(ColmName[2])" ),
Data Table( "BIG_CLASS_sub_(ColmName[3])" ),
Create source column) ;
내 실제 WIDE 테이블에는 약 100.000개의 데이터 라인이 있고 약. 열 100개. 전반적으로 JMP는 LONG 형식에 도달할 때까지 +1,000만 개의 데이터 행을 처리할 것으로 예상할 수 있습니다.
나는 모든 조언을 환영합니다.
매우 감사합니다!
뉴비
문제를 올바르게 이해했는지 확실하지 않지만 다음과 같습니다. 요약() 그리고 스택() 일을 할 수 있습니다.
이것은 당신이 추구하는 것을 생산합니까? (정렬은 다를 것입니다)
Names Default To Here(1);
//example table
dt = New Table("Class",
New Column("name", Character, "Nominal", Set Values({"KATIE", "KATIE", "LOUISE", "JANE", "JANE", "JACLYN"})),
New Column("age", Numeric, "Ordinal", Set Values([12, 12, 12, 12, 12, 12])),
New Column("sex", Character, "Nominal", Set Values({"F", "F", "F", "F", "F", "F"})),
New Column("height", Numeric, "Continuous", Set Values([59, 61, 61, 55, 65, 66])),
New Column("weight", Numeric, "Continuous", Set Values([95, 105, 123, 74, 84, 145]))
);
//Summary
dtsum = dt << Summary(Group(:name, :sex), Mean(:age), Mean(:height), Mean(:weight), statistics column name format("column"));
// Stack summary table
dtstack = dtsum << Stack(columns(:age, :height, :weight), Source Label Column("Source_Col"), Stacked Data Column("Value"));