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