【问题标题】:Extract specific rows from SAS dataset based on a particular cell value of a variable根据变量的特定单元格值从 SAS 数据集中提取特定行
【发布时间】:2017-11-17 04:13:36
【问题描述】:

我想根据变量的特定单元格值从大型 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

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

谢谢

【问题讨论】:

  • 我认为您的术语不清楚。 extract 是什么意思?
  • 我很抱歉没有说清楚。以书面形式解释这是一个非常令人困惑的问题。我会尽力再解释一遍。
  • 我想从这个数据集中选择(提取)多组 8 行到一个新的数据集中。这些集合在此数据集中以不均匀的间隔分布。换句话说,这些集合之间还有许多其他行,我不需要。所有这些集合的唯一共同模式是它们有前一行,其中 Var1 变量的值为“Sample”。我的问题在下面的帖子中。
  • 我的问题是,我可以使用 VAR1 的这个值(样本)编写一个条件,这样我就可以选择接下来的 8 行(在本例中:第 6 行至第 13 行)到新数据集?我希望这能澄清我的问题

标签: sas


【解决方案1】:

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;

【讨论】:

  • 感谢您的回复。我不希望新数据集中 Var1 的单元格值为“Sample”的行。我想要新数据集中的以下 8 行(第 6 行 - 第 13 行)。我想从这个数据集中选择(提取)多组这样的 8 行到一个新的数据集中。这些集合在此数据集中以不均匀的间隔分布。换句话说,这些集合之间还有许多其他行,我不需要。所有这些集合的唯一共同模式是它们有前一行,其中 Var1 变量的值为“Sample”。我的问题在下面的帖子中。
  • 我的问题是,我可以使用 VAR1 的这个值(样本)编写一个条件,这样我就可以选择接下来的 8 行(在本例中:第 6 行至第 13 行)到新数据集?
  • 如果在“样本”行之后(或包括?)总是 8 行,那么我建议昆汀的回答。您需要多个数据集吗?还是只将 8 行输出到 一个 其他数据集?
【解决方案2】:

一种方法是在前一条记录具有 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 ;

【讨论】:

    【解决方案3】:

    您可以根据需要设置计数器和输出,将 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;
    

    【讨论】:

    • 这将输出不需要的第 2-4 行。
    • 我认为如果你使用retain counter 999; 或类似的,它会起作用,所以计数器以任意高的值开始。
    • 谢谢!现已修复。
    • 大家好,我尝试使用@Reeza 的方法,效果很好。我也尝试过使用 Quentin 的方法,它也很有帮助。非常感谢你们帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多