Letzte 30 Stück für jede Zeile und löschen Sie die anderen DatenHallo alle zusammen,
Ich habe eine Datentabelle mit mehreren Spalten und jede Spalte hat eine andere Anzahl von Zeilen mit Daten darin. Ich versuche, einen Weg zu finden, die letzten 30 Zeilen der Daten in jeder Spalte zu erhalten. Zum Beispiel hat Spalte 1 50 Zeilen und Spalte 2 hat 75 Zeilen und ich möchte, dass jede Zeile die letzten 30 Zeilen mit Informationen enthält. Gibt es ein Skript, das das kann?
DatentabelleSkriptingRe: Letzte 30 Stück für jede Zeile und die anderen Daten löschenDas Löschen aller bis auf die letzten 30 Zeilen in einer Datentabelle ist einfach.
Names Default To Here( 1 );
dt = Current Data Table();
dt << select where( Row() > N Rows( dt ) - 30 );
dt << delete rows;
Wenn Sie die letzten 30 nicht fehlenden Datenpunkte für jede Spalte finden und diese dann als Ihre n Spalten mit 30 Datenzeilen speichern möchten, ist dies etwas schwieriger und ich werde die Gültigkeit dieser Vorgehensweise in Frage stellen.Das Ergebnis wäre, so ziemlich jede Beziehung zwischen Datenpunkten zwischen den verschiedenen Spalten zu entfernen.
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: Letzte 30 Stück für jede Zeile und die anderen Daten löschenHier ist eine andere Version, um das gleiche Ergebnis wie die zweite Lösung von . zu erzielen @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: Letzte 30 Stück für jede Zeile und die anderen Daten löschen@markbailey Das funktioniert super! Ich habe festgestellt, dass ich Daten in Spalten habe, die kleiner als 30 und größer als 30 sind. Gibt es eine einfache Möglichkeit, dies nur anzuzeigen? Ein Beispiel Spalte 1 hat 50 Zeilen und Spalte 2 hat 75 Zeilen und Spalte 3 hat 28 Zeilen und ich möchte, dass jede Zeile die letzten 30 Zeilen mit Informationen enthält, nichts unter 30. Wenn sie also 29 oder weniger Datenpunkte hat, möchte ich sie löschen Auch. Danke für die Hilfe!
Re: Letzte 30 Stück für jede Zeile und die anderen Daten löschenVersuchen Sie diese Version.
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;