【问题标题】:updating last not blank record SAS更新最后一个非空白记录 SAS
【发布时间】:2017-12-20 15:41:44
【问题描述】:

我有以下数据集。

ID    var1    var2    var3 
1     100     200     
1     150             300 

2             120                
2     100     150     200   

3     200             150             
3     250    300                      

我想要一个新的数据集,每组变量只有最后一个非空白记录。

id    var1    var2    var3
1     150     200     300              
2     100     150     200               
3     250     300     150      

最后。选择最后一条记录,但我需要选择最后一条非空记录

【问题讨论】:

  • 图片无论如何都没有帮助。如果您想要代码,我们必须输入它和代码,这有点不体谅。请将您的数据以文本形式发布,并附上您迄今为止为解决此问题所做的尝试。

标签: sas


【解决方案1】:

看起来你想要每个非键变量的最后一个非缺失值。因此,您可以让UPDATE 语句为您完成工作。通常对于更新操作,您将事务应用于主数据集。但是对于您的应用程序,您可以使用 OBS=0 数据集选项来使您当前的数据集同时作为主数据集和事务工作。

data want ;
  update have(obs=0) have ;
  by id;
run;

【讨论】:

  • 好转的汤姆!
【解决方案2】:

里卡多:

有多种方法可以在每个组中选择每列的最后一个非缺失值。这里有三种方式。我不会说一种方法是最好的方法,每种方法都有其优点,具体取决于特定的数据集、编码人员的舒适度和长期可维护性。

方式 1 - UPDATE 语句

也许最简单的编码方法是这样的:

  • 创建一个数据集,每个 id 有一行,列与原始数据相同。
  • 使用UPDATE 语句将每个类似命名的变量替换为非缺失值。

例子:

data want_base_table(label="One row per id, original columns");
  set have;
  by id;
  if first.id;
run;

* use have as a transaction data set in the update statement;
data want_by_update;
  update want_base_table have;
  by id;
run;

方式 2 - DOW 循环

其他将涉及数组和首先。最后。标记BY 组的变量。此示例显示了一个 DOW 循环,该循环跟踪非缺失值,然后将它们用于每个 ID 的输出:

data want_dow;
  do until (last.id);
    set have;
    by id;

    array myvar var1-var3 ;
    array myhas has1-has3 ;

    do _i = 1 to dim(myvar);
      if not missing (myvar(_i)) then 
        myhas(_i) = myvar(_i);
    end;
  end;

  do _i = 1 to dim(myhas);
    myvar(_i) = myhas(_i);
  end;

  output;

  drop _i has1-has3;
run;

DO; END; 块内有SET 语句并且循环终止由last. 标志变量触发时,循环通常称为DOW 循环。类似的非 DOW 方法(未显示)将使用隐式循环和 first. 来初始化跟踪数组,并使用 last. 将值(在组内跟踪)复制到列中以供输出。

方式 3 - 合并列切片

data want_by_column_slices;
  merge
    have (keep=id var1 where=(var1 ne .))
    have (keep=id var2 where=(var2 ne .))
    have (keep=id var3 where=(var3 ne .))
  ;
  by id;
  if last.id;
run;

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多