모두들 안녕,
내 질문은 두 가지입니다. 내 데이터는 다음과 같이 나타납니다.
| 1-A | 엑스 | 와이 | . | . | . | . |
| 1-A | . | . | 지 | 큐 | . | . |
| 1-A | . | . | . | . | 승 | 승 |
| 2-B | 와이 | 승 | . | . | . | . |
| 2-B | . | . | 티 | 와이 | . | . |
| 2-B | . | . | . | . | 큐 | 피 |
A) 빈 데이터 포인트를 삭제하고
각 행이 공통적으로 갖는 첫 번째 열의 식별자에 따라 행을 통합하고 싶습니다(예: 1-A 및 2-B).
최종 결과는 다음과 같습니다.
수백 개의 값이 있는 대형 테이블에 대해 이 문제에 접근하는 방법에 대한 제안이 있는 사람이 있습니까?
미리 감사드립니다.
백인
큰 총을 사용할 시간입니다.작동해야 하는 스크립트는 다음과 같습니다.기본적으로 작동 방식은 모든 행과 열을 반복하는 것입니다.다음 행의 ID가 동일한 경우 누락되지 않은 값을 다음 행으로 전달합니다.지정된 ID의 마지막 행에는 누락되지 않은 모든 값이 해당 행에 있어야 합니다.마지막 단계에서는 추가 행을 모두 삭제합니다.
dt = Current Data Table();
dt << New Column( "Delete Later", character, formula( If( :ID[Row()] == :ID[Row() + 1], "Yes", "No" ) ) );
for(i=1,i<=N Row(dt),i++, //iterate through each row
//If next row has same ID, pass non-missing values down to next row
If(:Delete Later[i] == "Yes",
for(j=2,j<= (N Col(dt) - 1),j++, //iterate through each column (except ID and Delete Later)
//pass non-missing data down to next row
if(!isMissing(Column(dt,j)[i]), Column(dt,j)[i+1] = Column(dt,j)[i])
)
)
);
//Collapse all the extra rows
dt << Select Where(:Delete Later == "Yes") << Delete Rows();
이것은 귀하의 예에 완벽하게 작동했습니다.테이블에 적합해야 하지만 수백만 개의 행이 있는 경우 완료하는 데 오랜 시간이 걸릴 수 있습니다.또한 이 스크립트에서는 열 이름이 "ID"이고 다른 모든 열에는 각 ID의 행 1개에 대해서만 누락되지 않은 값이 있어야 한다고 가정합니다.
스크립트를 테스트하는 데 사용한 시작 테이블:
최종 테이블:
내 시작 테이블을 다시 만드는 스크립트:
New Table( "ConsolidateTable",
Add Rows( 6 ),
New Column( "ID",
Character( 3 ),
"Nominal",
Set Values( {"1-A", "1-A", "1-A", "2-B", "2-B", "2-B"} ),
Set Display Width( 87 )
),
New Column( "Column 2",
Character( 16 ),
"Nominal",
Set Values( {"x", "", "", "y", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 3",
Character( 16 ),
"Nominal",
Set Values( {"y", "", "", "w", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 4",
Character( 16 ),
"Nominal",
Set Values( {"", "z", "", "", "t", ""} ),
Set Display Width( 87 )
),
New Column( "Column 5",
Character( 16 ),
"Nominal",
Set Values( {"", "q", "", "", "y", ""} ),
Set Display Width( 87 )
),
New Column( "Column 6",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "q"} ),
Set Display Width( 87 )
),
New Column( "Column 7",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "p"} ),
Set Display Width( 87 )
)
)불행하게도 이 테이블에는 1000개 이상의 열이 있습니다. 제안해 주셔서 감사합니다만, 그건 실현 가능하지 않은 것 같습니다.
이제 빈 데이터를 무시하고 나중에 처리하고 싶다고 가정해 보겠습니다. 행을 어떻게 통합합니까?그 단계가 더 실현 가능하기를 바랍니다.
열이 너무 많지 않은 경우 먼저 모든 문자를 만들고 제가 권장하는 단계를 사용한 다음 숫자 열을 다시 변환할 수 있습니다.테이블이 예제보다 훨씬 넓다면 이는 실현 가능하지 않을 수 있습니다.
불행하게도 데이터는 범주형, 이진형, 숫자형, 자유 텍스트 등 혼합되어 있습니다. 데이터베이스를 단순화하고 불필요한 빈 항목을 제거하려고 합니다. 제안해 주셔서 감사합니다. 하지만 이 시나리오에서는 효과가 없을 것 같습니다.
첫 번째 열을 제외하고 데이터가 숫자인 경우 다음을 사용할 수 있습니다.
표==>요약
문제의 열에 대한 평균 또는 합계를 생성하도록 지정합니다.
신속한 답변에 감사드립니다. 실제 테이블에서 많은 세부 사항을 얼버무렸다는 점을 덧붙이고 싶습니다. 예를 들어, 1단계를 시도하면 JMP에서 "스택할 수 없습니다. 누적 열의 데이터 유형이 다릅니다."
다양한 데이터 유형의 열을 쌓는 방법이 있습니까?
가장 고통스럽지 않은 방법은 다음과 같습니다.
1. ID 열을 제외한 모든 열을 쌓아서 모두 단일 데이터 열로 통합합니다(결과 레이블 열은 추적성을 유지함).
2. 새 데이터 열에서 누락된 값이 있는 모든 행을 삭제합니다. 쉬운 방법: 누락된 값 선택 > 해당 값을 마우스 오른쪽 버튼으로 클릭 > 일치하는 셀 선택 > 마우스 오른쪽 버튼 클릭 > 행 삭제.
삼. 데이터 테이블의 원래 모양으로 돌아가려면 테이블 분할을 수행합니다. 분할 열은 새 데이터 열입니다. 분할 기준은 새로운 레이블 열이며, ID 열을 기준으로 그룹화할 수 있습니다.