根据多列选择位置<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我不确定是否有一个很好的方法来做我希望做的事情,但我有以下情况:
我有一个数据文件,它是每秒收集测量结果。有一个时间戳列,一个状态列,然后是我的所有数据列。
状态列中有三个不同的可能条目,“RAMP”,“WAIT”和“READ”。按时间顺序排列数据通常会产生大约20行“RAMP”,然后是85行“WAIT”,接着是9行“READ”,然后重复十几次。我想要选择的我感兴趣的区域是每个区域中标记为“等待”的最后30行。
显然,选择所有“WAIT”行或整个文件的最后30行非常简单,但我无法弄清楚如何只选择每个部分的最后30行。
有解决这个问题的好方法吗?
Re:根据多列选择位置如何获取表名和列表项数:
DT = 当前数据表 () ;
dt_name = DT << 得到名字 ;
LST = { “一个” , “B” , “C” } ;
NITEMS ( LST ) ;
使用||将字符串与另一个字符串连接起来:
“串” || ( DT << 得到名字 )
Re:根据多列选择位置我知道的另一个函数*必须存在,但我找不到 - 当前数据表()返回一个我可以分配给dt的引用,但我正在寻找一种方法来提取表的名称 - 我有一个脚本我想在许多不同的表上运行,我想在当前表上启动它,然后创建一个名为“ ”的新子集表。我期待输出表名(“string”dt)或(“string”$ dt)可以工作,类似的东西,但事实并非如此。我正在寻找文档,但我想我会把这个评论扔出去以防万一。
Re:根据多列选择位置我找到了一种方法来制作我想要的清单 - 我补充道:
last_30_waits = {};
for(j = 1,j <= 3,j ++,
for(i = 0,i <= 3,i ++,
INSERTINTO(last_30_waits,(wait_end_list- 一世))));
dt <<选择行(last_30_waits);
但我觉得这不是最佳的。还有,是否有一个函数可以返回列表中的条目数?我想在我的第一个for循环中用该函数替换“3”,但是我找不到它。
Re:根据多列选择位置谢谢,这让我非常接近,但我还有一个无能为力的问题 - 在每对wait_start_list / wait_end_list数字之间选择所有*的最佳方法是什么?我之前没有使用过列表。(我对一般的脚本非常陌生,但我正努力学习,因为我尽我所能。)
Re:根据多列选择位置这是一种方法。 您搜索所有WAIT行,然后遍历行号。 如果有一个大于1的间隙,你就会找到一个部分的结尾。 下面的代码构建了两个列表,用于标识每个部分的起始行号和结束行号。 我为这个例子创建了一个小表;改变了 ntail 参数为三十为您的数据。
DT = 新表 ( “温度” ,
添加行 ( 39 ) ,
新栏目 ( “状态” ,
字符 ,
公称 ,
设定值 (
{ “RAMP” , “RAMP” , “RAMP” , “等待” , “等待” , “等待” , “等待” , “等待” , “读” ,
“读” , “读” , “读” , “读” , “RAMP” , “RAMP” , “RAMP” , “等待” , “等待” ,
“等待” , “等待” , “等待” , “读” , “读” , “读” , “读” , “读” , “RAMP” ,
“RAMP” , “RAMP” , “等待” , “等待” , “等待” , “等待” , “等待” , “读” , “读” ,
“读” , “读” , “读” }
)
) ,
) ;
wait_rows = DT << 得到行在哪里 ( : 状态 == “等待” ) ;
NR = NROWS ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows [ 1 ] - 1 ;
//要获取的WAIT行数
ntail = 4 ;
//这将获得最后4个WAIT行。 替换为30以获取最后30个WAIT行
对于 ( 一世 = 1 ,一世 <= NR ,一世 ++,
NEW_ROW = wait_rows [ 一世 ] ;
//在行列表中查找大于1的间隙
如果 (( NEW_ROW - old_row ) > 1 ,
插入 ( wait_start_list , ( old_row - ntail + 1 )) ;
插入 ( wait_end_list , old_row ) ;
) ;
old_row = NEW_ROW ;
) ;
//照顾最后一组WAIT
old_row = wait_rows [ NR ] ;
插入 ( wait_start_list , ( old_row - ntail + 1 )) ;
插入 ( wait_end_list , old_row ) ;
Re:根据多列选择位置不幸的是,我目前只是JMP,没有基本的SAS - 但感谢你的建议。
Re:根据多列选择位置你在JMP论坛上发布了这个,所以我不确定这是否有帮助。 使用基础SAS,如果您使用正确的工具,它是一个相对较短的程序:
数据last_30_waits;
group_num + 1;
n_waits = 0;
直到(last.status和status ='WAIT');
设定测量值(保持=状态);
状态未分类;
如果status ='WAIT'则n_waits + 1;
结束;
**此时,group_num标识一组WAIT,n_waits显示该组中有多少条记录;
n_found = 0;
直到(last.status和status ='WAIT');
设定测量;
状态未分类;
如果status ='WAIT'则执行;
n_found + 1;
如果n_found> = n_waits - 29则输出;
结束;
结束;
drop n_found;
跑;
祝好运。