【问题标题】:SAS Modify and/or Replace Master Data with Updated DataSAS 用更新的数据修改和/或替换主数据
【发布时间】:2015-04-21 18:50:11
【问题描述】:

我有两个数据集——一个主数据集,需要使用包含在单独数据集中的最新数据定期更新。我一直在玩MODIFY 语句,但我无法完全替换数据组。下面的代码创建了两个示例数据集:

data new;
    input year dqtr age yearq;
    datalines;
    2011    4   43  20114
    2011    4   25  20114
    2013    1   52  20131
    2013    1   45  20131
    2013    2   72  20132
    2013    2   43  20132
    2013    3   93  20133
    2013    3   97  20133
    2013    4   23  20134
    2013    4   37  20134
;
run;

data master;
    input year dqtr age yearq;
    datalines;
    2011    3   94  20113
    2011    3   76  20113
    2011    3   56  20113
    2011    4   43  20114
    2011    4   62  20114
    2011    4   73  20114
;
run;

变量 YEARQ 是 YEAR 和 DQTR 的串联变量。如果 YEARQ 组合不在主数据集中,则应附加。如果它在主数据集中,那么它应该替换整个组。例如,最终数据集中应该只有 YEARQ=20114。应将 3 个原始 20114 obs 替换为 2 个新 20114 obs。下面的代码几乎可以满足我的要求,但不会替换整个 YEARQ 组(它只替换了第一个但发现的该组合的许多观察结果):

data master(index=(yearq)); 
    set master;
run;

data master;
    set new;
    modify master key=yearq;
   if _iorc_ =0 then replace;
   else do; 
         _error_=0;       
         _iorc_=0;  
      output;  
      end;
run;

【问题讨论】:

  • 不幸的是,我认为这是modify 工作方式的产物——我认为您不能将其用于此目的(或mergeupdate)。我没有时间给出完整的答案,但基本问题是修改(等)并没有真正按照您认为的方式工作。每次匹配时,它都会在主数据集中推进指针 - 所以它只会替换它必须替换的数字。我想你也许可以做一个带键的集合,但我必须考虑更多。
  • 谢谢你的想法,乔。似乎modifyupdate 应该能够执行这种类型的数据处理,但我明白你在说什么。
  • 所以,我相信我在文档中找到了有关如何执行此操作的适当说明,但我需要一些时间才能弄清楚。这是相关链接 (support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/…)。搜索“重复索引值”。它说“如果主数据集中的索引变量存在重复值,则仅检索、修改或替换第一次出现的值。使用 DO LOOP 多次执行带有 KEY= 选项的 SET 语句以更新所有重复项与交易价值”。
  • 也许更熟悉使用 DO LOOP / SET 过程的人可能会破解它...这不是我的强项。
  • @RobertPenr​​idge 这是当主数据集和更新数据集具有重复索引值时的 do-loops 文档的链接support.sas.com/techsup/technote/ts611.pdf - 链接不起作用,因此可能需要复制和粘贴。第 20-21 页似乎有我想要的东西,但它仍然没有产生我想要的结果。这需要一些修修补补。

标签: replace merge append sas updates


【解决方案1】:

当我看到你的update 进程时,基本上你想要做的是跟随

  1. 如果您的new 数据集包含现有的yearq 值,那么您将在master 数据集中对其进行更新,即从master 中删除所有常见的yearq,并从@987654328 中添加新的yearq @到master
  2. 此外,您还将任何新的 yearq 附加到 master 数据集。

提取常用yearq

proc sql;
create table common as select distinct(a.yearq) from master as a, new as b
where a.yearq=b.yearq;
quit;

从主服务器中删除公共yearq

proc sql;
create table temp as select * from master where yearq not in(select yearq from common);
quit;

new 数据集附加到master 数据集

data master;
set temp
    new;
    run;

【讨论】:

  • 感谢@NEOmen——效果很好!我以前见过proc sql a.b. 代码,但不太确定如何组合使用它们。这应该足够了。
  • @Foxer 虽然这可能会解决您遇到的问题,但我不确定它是否回答了问题,基本上是如何在数据集中使用 modify 语句来更新多行。我认为赞成投票是有道理的,但我个人会犹豫将其标记为“已接受”的答案,因为其他人将来也可能遇到同样的问题,并来这里寻找使用数据步骤和修改语句的解决方案。我认为当数据集很大并且可能已编入索引并且重建它们的成本过高时会出现这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多