每行最后30条并删除其他数据大家好,
我有一个包含多列的数据表,每列都有不同数量的包含数据的行。 我试图找到一种方法来获取每列中数据的最后 30 行。 例如,第 1 列有 50 行,第 2 列有 75 行,我希望每一行都有最后 30 行信息。 有没有可以做到这一点的脚本?
数据表脚本编写回复:每行最后 30 条并删除其他数据删除数据表中除最后 30 行之外的所有行很容易。
Names Default To Here( 1 );
dt = Current Data Table();
dt << select where( Row() > N Rows( dt ) - 30 );
dt << delete rows;
如果您要求找到每列的最后 30 个非缺失数据点,然后将其保存为您的 n 列乘 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 ) );
);回复:每行最后 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;
回复:每行最后 30 条并删除其他数据@马克贝利这很好用! 我开始意识到我的列中有小于 30 和大于 30 的数据,有没有一种简单的方法可以只显示这一点? 一个例子第 1 列有 50 行,第 2 列有 75 行,第 3 列有 28 行,我希望每一行都有最后 30 行的信息,没有低于 30 的信息,所以如果它有 29 个或更少的数据点,我想删除它还。 谢谢您的帮助!
回复:每行最后 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;