각 행의 마지막 30개 조각 및 다른 데이터 삭제여러분, 안녕하세요,
여러 열이 있는 데이터 테이블이 있고 각 열에는 데이터가 포함된 행 수가 다릅니다. 각 열에서 데이터의 마지막 30개 행을 가져오는 방법을 찾으려고 합니다. 예를 들어 열 1에는 50개의 행이 있고 열 2에는 75개의 행이 있으며 각 행에 마지막 30행의 정보가 있기를 원합니다. 그렇게 할 수있는 스크립트가 있습니까?
데이터 테이블스크립팅Re: 각 행의 마지막 30개 조각 및 다른 데이터 삭제데이터 테이블에서 마지막 30개 행을 제외한 모든 행을 삭제하는 것은 쉽습니다.
Names Default To Here( 1 );
dt = Current Data Table();
dt << select where( Row() > N Rows( dt ) - 30 );
dt << delete rows;
각 열에 대해 누락되지 않은 마지막 30개의 데이터 포인트를 찾은 다음 이를 n개의 열 x 30개의 데이터 행으로 저장하도록 요청하는 경우, 이는 조금 더 어려우며 그렇게 하는 것이 타당한지 질문하겠습니다.그 결과 서로 다른 열 사이의 데이터 포인트 간의 관계가 거의 제거됩니다.
Names Default To Here( 1 );
dt = Current Data Table();
// Copy the data table retaining no rows;
dtCopy = dt << subset( selected rows( 0 ), selected columns( 0 ) );
dtCopy << select where( Row() >= 0 );
dtCopy << delete rows;
For( i = 1, i <= N Cols( dtCopy ), i++,
theList = {};
For( k = N Rows( dt ), k >= 1, k--,
If( Is Missing( Column( dt, i )[k] ) == 0,
Insert Into( theList, Column( dt, i )[k] );
If( N Items( theList ) >= 30,
Break()
);
)
);
Column( dtCopy, i ) << set values( Reverse( theList ) );
);Re: 각 행의 마지막 30개 조각 및 다른 데이터 삭제다음은 두 번째 솔루션과 동일한 결과를 달성하는 다른 버전입니다. @txnelson
For( col = 1, col <= N Col( dt ), col++,
values = Column( dt, col ) << Get Values;
end = Contains( values, . ) - 1;
If( end == -1, end = N Row( dt ) );
view = end - 29 :: end;
Column( dt, col ) << Set Values( values[view] );
);
dt << Select Where( Row() > 30 ) << Delete Rows;
Re: 각 행의 마지막 30개 조각 및 다른 데이터 삭제@markbailey 이것은 잘 작동합니다! 30보다 작고 30보다 큰 열에 데이터가 있다는 것을 깨달았습니다. 이것을 표시하는 쉬운 방법이 있습니까? 예 열 1에는 50개의 행이 있고 열 2에는 75개의 행이 있고 열 3에는 28개의 행이 있으며 각 행에 30개 미만의 정보가 없는 마지막 30개 행이 있기를 원하므로 데이터 포인트가 29개 이하인 경우 삭제하고 싶습니다 또한. 도와 주셔서 감사합니다!
Re: 각 행의 마지막 30개 조각 및 다른 데이터 삭제이 버전을 사용해 보세요.
Names Default to Here( 1 );
// create the example
dt = New Table( "Odd Lengths",
New Column( "Column 1", Numeric, Continuous, Values( 1::50 ) ),
New Column( "Column 2", Numeric, Continuous, Values( 1::75 ) ),
New Column( "Column 3", Numeric, Continuous, Values( 1::28 ) )
);
Wait( 0 );
// process the data table
For( col = N Col( dt ), col > 0, col--,
values = Column( dt, col ) << Get Values;
not missing = Sum( Not( Is Missing( values ) ) );
If( not missing < 30,
dt << Delete Columns( Column( dt, col ) ),
end = Contains( values, . ) - 1;
If( end == -1, end = N Row( dt ) );
view = end - 29 :: end;
Column( dt, col ) << Set Values( values[view] );
);
);
dt << Select Where( Row() > 30 ) << Delete Rows;