모드를 찾아서<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕하세요 여러분,
나는 다른 변수의 각 범주에 대한 변수의 모드를 제공하는 여름 테이블을 생성하고 싶습니다.
이상적으로는 다음과 같이 작동합니다.
dt = 열기("$SAMPLE_DATA/Mail Messages.jmp");
dt << 요약 ( 그룹 ( :From ), 모드 (:To) );
또는 "From"을 기준으로 테이블을 쌓고 각 행의 모드를 계산합니다. 그러나 "모드"는 테이블 요약이나 열 수식의 옵션이 아닙니다.
SAS로 보내는 것을 포함하여 모드를 계산하는 모든 아이디어를 환영합니다.
저는 JMP 10을 사용하고 있습니다.
감사합니다,
론
Re: 모드 찾기안녕-모드는 가장 흔한 항목입니다,따라서 당신은 각 발신자로부터 가장 많은 수의 편지를 받은 사람 ( 또는 동점인 경우 여러 사람 ) 을 찾고 있는 것입니다.,그렇죠? 그렇다면,다음과 같이 하면 될 것 같습니다. 하지만 훨씬 더 우아하고/또는 더 짧은 방법이 있을 거라는 데 의심의 여지가 없습니다. 저는 의도적으로 모든 중간 계산을 남겨두었습니다.,그리고 감사 추적을 위해 모든 테이블의 이름을 지정했습니다.:
디티1= 열려 있는 ("$SAMPLE_DATA/메일 메시지.jmp");
디티1<<세트 이름 ("dt1");
디티2=디티1<<요약 ( 그룹 (:에서 ), N,하위 그룹 (:에게 ) );
디티2<<세트 이름 ("dt2");
보낸 사람=( dt2<<열 이름 가져오기 );
보여주다(보낸 사람 );
// 이 목록의 처음 두 요소를 버립니다.
에서 제거하다(보낸 사람, {1, 2});
보여주다(보낸 사람 );
// 쌓아 올리세요.
디티3=디티2<<스택 ( 열 (평가하다(보낸 사람 )), 소스 레이블 열 ("상표" ), 스택 데이터 열 ("데이터" ));
디티3<<세트 이름 ("dt3");
// dt3에는 이제 각 사람이 각 수신자에게 보낸 편지의 수가 포함됩니다.
디티4=디티3<<요약 ( 그룹 (:에서 ), 맥스( :데이터 ) );
디티4<<세트 이름 ("dt4");
// dt4에는 이제 각 사람이 한 수신자에게 보낸 편지의 최대 수가 포함됩니다.
디티5=디티4<<( dt3)와 함께 ( 조인 ),
SelectWith ( : 에서 , : 상표 , : 데이터 ) ,
열 일치로 (:에서= :에서, :이름 ("최대(데이터)" ) = :데이터 ),
다중 삭제 (0, 0 ),
이름 ( "일치하지 않는 항목 포함" )( 0 , 0 ) ,
기본 테이블 순서 유지 (1 )
);
디티5<<세트 이름 ("디티5");
열(디티5, "상표") <<세트 이름 ("받는 사람");
/*
이제 dt5에는 각 수신자가 모든 수신자에게 보낸 최대 편지 수가 포함되어야 합니다.
그리고 해당 수신자의 이름(동점인 경우 수신자 여러 명)
*/
그러면 Ann이 Michael에게 4통의 편지를 보냈고, Jeff가 Michael에게 7통의 편지를 보냈고, John이 Michael에게 12통의 편지를 보냈고, Katherine이 John에게 12통의 편지를 보냈다는 것을 알 수 있을 겁니다. 이렇게 해서 원하는 대로 되는지 확인해 보시겠어요? 각 수신자가 한 발신자에게서 받은 편지의 최대 개수를 구하려면 :To 열과 :From 열을 서로 바꾸면 됩니다.
Re: 모드 찾기도도님, 고맙습니다.
잘 작동합니다.
Re: 모드 찾기안녕하세요, 도도와 여러분,
Dodo의 솔루션은 기술적으로는 올바르지만 빅데이터를 다루는 데는 유용하지 않습니다.
생각해 보니 확장 가능한 대체 솔루션이 있더군요.
dt1 = Open( "$SAMPLE_DATA/Mail Messages.jmp" );
dt1 << set name( "dt1" );
// 발신자별 수신자 분포 생성
dt1 << 새 스크립트( "분포", 분포( 명목 분포( 열( :To ) ), 기준( :From ) ) );
Dist = Dt1 << 스크립트 실행( "Distribution" );
// 빈도표를 하나의 데이터 테이블로 추출합니다.
dt2 = Report(dist[1])["빈도"][테이블 상자(1)] << 결합된 데이터 테이블 만들기;
dt2 << set name( "dt2" );
dist << 창 닫기;
// 데이터 테이블에서 "전체" 행을 제거합니다. 이는 관련 빈도를 나타내지 않습니다.
선택 = dt2 << 선택 위치( :Level == "전체" );
선택 << 행 삭제;
// 각 "From"에 대한 "To" 모드를 얻기 위해 요약합니다.
dt3 = Data Table( "dt2" ) << Summary( Group( :From ), Max( :Count ), 통계 열 이름 format( "column" ), 원본 데이터 테이블에 대한 링크( 0 ) );
dt3 << Set Name( "모드" );
// "To" 값을 얻기 위해 요약 테이블을 업데이트합니다.
dt3 << Update( With( Data Table( "dt2" ) ), Match Columns( :From = :From, :Count = :Count ), Add Columns from Update table( :Level ) );
dt2 << 창 닫기;
Column( dt3, "레벨" ) << Set Name( "모드" );
Re: 모드 찾기JMP에서 작업을 수행하는 방법은 여러 가지가 있습니다. 얼마 전에 작성한 함수가 생각났는데, 하나 이상의 열로 그룹화된 가장 일반적인 항목을 찾는 데 매우 효율적입니다. 위의 접근 방식에 대한 대안으로 이 함수를 공유합니다. 결과는 Dodo 함수와 비슷합니다. Ron의 update() 방식처럼 마지막 항목만 반환되는 것이 아니라, 모든 "동점" 모드가 반환됩니다.
mode_by_groups = 기능 ( { collist } , // 열 이름 목록
// collist에서 마지막 열의 모드를 찾습니다.
요약 ( g = by ( 평가하다 ( collist ) ) , n = 세다 () ) ;
X = 디자인 ( g [ 1 ] )
n ;
i = 장소 ( V 맥스 ( 전치 ( X == 반복 ( V 맥스 ( X ) , N 행 ( n ) )) ) ) )) ;
//새 테이블에 그룹화 열 추가
dt1 = 새 테이블 ( "모드" ) ;
( k = 1 , k < = N 항목 ( collist ) - 1 , k ++,
dt1 << ( 새 열 ( 숯 ( collist [ k ]) , 문자 , 값 설정 ( g [ k ][ i ] ) )) ;
);
//모드와 N 추가
dt1 << 새로운 칼럼( "모드" || 숯(collist[k]), Character, set values( g[k][i] ) );
dt1 << 새로운 칼럼( "N", set values( n[i] ) );
);
//예시
( "$SAMPLE_DATA/Mail Messages.jmp" ) 를 엽니다 .
그룹별 모드 ( { 시작 , 종료 } ) ;
열려 있는( "$SAMPLE_DATA/Consumer Preferences.jmp" );
mode_by_groups ( { 성별 , 미혼 상태 , 출생 연도 } ) ;