Ultimare 30 pezzi per ogni riga e cancellare gli altri datiCiao a tutti,
Ho una tabella di dati che ha più colonne e ogni colonna ha una quantità diversa di righe con dati al suo interno. Sto cercando di trovare un modo per ottenere le ultime 30 righe dei dati in ogni colonna. Ad esempio, la colonna 1 ha 50 righe e la colonna 2 ha 75 righe e voglio che ogni riga contenga le ultime 30 righe di informazioni. C'è uno script che può farlo?
Tabella datiScriptingRe: Ultimi 30 pezzi per ogni riga e cancellazione degli altri datiPer i futuri lettori di questo brano, una correzione a @Mark_Bailey dichiarazione sul suo codice rispetto al secondo pezzo di codice dalla risposta di @txnelson deve essere chiarita.Le due parti di codice produrranno gli stessi risultati se si assume che, una volta trovato un valore mancante, nella colonna non compaiano altri valori non mancanti.@Mark_Bailey code richiede che esista il numero minimo di valori non mancanti, mentre il codice @txnelson no
Re: Ultimi 30 pezzi per ogni riga e cancellazione degli altri datiFWIW, ecco un'altra versione che utilizza le matrici:
NamesDefaultToHere(1);
// Make a data table 'dt', to play with.
nr = 100; // Number of rows
nc = 30; // Number of columns
p = 0.7; // Proportion of missing values
vals = J(nr*nc, 1, RandomInteger(0, 99));
makeMissing = RandomIndex(nr*nc, Floor(nr*nc*p));
vals[makeMissing] = .;
dt = AsTable(Shape(vals, nr, nc));
dt << setName("Random Integers with some missing");
// Start here with the current table . . .
lastN = 30; // Number of non-missing values to retain
dt = CurrentDataTable();
vals = dt << getAsMatrix;
// Loop over columns . . .
newVals = [];
for(c=1, c<=NCol(vals), c++,
NMV = vals[LocNonMissing(vals[0, c]), c]; // Non-mising values in this column
if(NRow(NMV) >= lastN, // Do we have enough non-missing values?
lastNMV = NMV[(NRow(NMV) - lastN + 1)::NRow(NMV)]; // If so, get the 'lastN' of these . . .
newVals = newVals||lastNMV; // . . . and add them into a new column
);
);
dt2 = AsTable(newVals);
dt2 << setName("Last "||Char(lastN)||" non-missing Random Integers");Re: Ultimi 30 pezzi per ogni riga e cancellazione degli altri datiProva questa versione.
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;
Re: Ultimi 30 pezzi per ogni riga e cancellazione degli altri dati@Mark_Bailey Funziona alla grande! Mi sono reso conto di avere dati in colonne inferiori a 30 e maggiori di 30 c'è un modo semplice per mostrare solo questo? Un esempio la colonna 1 ha 50 righe e la colonna 2 ha 75 righe e la colonna 3 ha 28 righe e voglio che ogni riga abbia le ultime 30 righe di informazioni niente che sia inferiore a 30 quindi se ha 29 o meno punti dati vorrei eliminarlo Anche. Grazie per l'aiuto!
Re: Ultimi 30 pezzi per ogni riga e cancellazione degli altri datiEcco un'altra versione per ottenere lo stesso risultato della seconda soluzione da @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: Ultimi 30 pezzi per ogni riga e cancellazione degli altri datiEliminare tutte tranne le ultime 30 righe in una tabella di dati è facile.
Names Default To Here( 1 );
dt = Current Data Table();
dt << select where( Row() > N Rows( dt ) - 30 );
dt << delete rows;
Se stai chiedendo di trovare gli ultimi 30 punti dati non mancanti per ogni colonna, e poi di salvarli come n colonne per 30 righe di dati, è un po 'più difficile e metterò in dubbio la validità di farlo.Il risultato sarebbe rimuovere praticamente qualsiasi relazione tra i punti dati tra le diverse colonne.
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 ) );
);