根据变量的特定单元格值从SAS数据集中提取特定行

时间:2017-06-14 20:44:14

标签: sas

我想基于变量的特定单元格值将大型SAS数据集中的特定行集提取到新数据集中。在这个数据集中,我有6个变量。以下是此数据集的示例:

Variable names:   Var1      Var2      Var3   Var4   Var5  Var6
Row 1              A          1        2     3       4     5
Row 2              B          1        2     3       4     5
Row 3              A          1        2     3       4     5
Row 4              B          1        2     3       4     5
Row 5              Sample     1        2     3       4     5
Row 6              A          1        2     3       4     5
Row 7              B          1        2     3       4     5
Row 8              A          1        2     3       4     5
Row 9              B          1        2     3       4     5
Row 10             A          1        2     3       4     5
Row 11             B          1        2     3       4     5
Row 12             A          1        2     3       4     5
Row 13             B          1        2     3       4     5

从这个数据集中,我想从一行开始选择一组接下来的8行,其中Var 1的值为“Sample”。我想从这个数据集中提取多个这样的8行集合到一个新的数据集中。有人可以指导我如何在SAS中实现这一目标吗?

谢谢

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是,只要前一个记录具有var1 =" Sample",然后递减每个记录的计数器,就将计数器设置为8。并且只输出计数器>> 1的记录。

data want ;
  set have ;

  if lag(var1) = "Sample" then counter = 8 ;
  else counter+(-1) ;  *counter is implicitly retained ;

  if counter>=1 then output ;
  * drop counter ;
run ;

答案 1 :(得分:0)

output声明会对你有用吗?

data have;
    infile datalines dsd dlm=",";
    input   Variable_names  : $char10.
            Var1            : $char10.
            Var2            : 8.
            Var3            : 8.
            Var4            : 8.
            Var5            : 8.
            Var6            : 8.;
    datalines;
Row 1 , A     , 1, 2, 3, 4, 5
Row 2 , B     , 1, 2, 3, 4, 5
Row 3 , A     , 1, 2, 3, 4, 5
Row 4 , B     , 1, 2, 3, 4, 5
Row 5 , Sample, 1, 2, 3, 4, 5
Row 6 , A     , 1, 2, 3, 4, 5
Row 7 , B     , 1, 2, 3, 4, 5
Row 8 , A     , 1, 2, 3, 4, 5
Row 9 , B     , 1, 2, 3, 4, 5
Row 10, A     , 1, 2, 3, 4, 5
Row 11, B     , 1, 2, 3, 4, 5
Row 12, A     , 1, 2, 3, 4, 5
Row 13, B     , 1, 2, 3, 4, 5
;
run;

data want_without
     want_with;
    set have;
    if strip(Var1) = "Sample" then output want_with;
    else                           output want_without;
run;

答案 2 :(得分:0)

您可以根据需要设置计数器和输出,使用RETAIN和IF(& OUTPUT)语句。您可能需要调整IF条件,但我认为您可以在这里得到这个想法。

data want;
set have;
retain counter 10; 
if strip(Var1) = "Sample" then counter=1;
else counter+1;
if 2<=counter<=9 then OUTPUT;
*if 2<=counter<=9; *this is the same as above, but less code;
run;