gpt4 book ai didi

SAS 合并数据集以覆盖值

转载 作者:行者123 更新时间:2023-12-02 09:34:16 24 4
gpt4 key购买 nike

我想使用数据集 B 通过使用合并 ID 合并数据集 A 和 B 来覆盖数据集 A 中的某些值。然而它并没有按预期工作。这是我所做的测试:

/* create table A */
data a;
infile datalines;
input id1 $ id2 $ var1;
datalines;
1 a 10
1 b 10
2 a 10
2 b 10
;
run;

/* create table B */
data b;
infile datalines;
input id1 $ var1 var2;
datalines;
1 20 30
2 20 30
;
run;

/* merge A&B to overwrite var1 in table A using values in table B */
data c;
merge a b;
by id1;
run;

表 C 如下所示:

 ID1 ID2 VAR1 VAR2

1 a 20 30

1 b 10 30

2 a 20 30

2 b 10 30

为什么第 2 行和第 4 行中的 10 没有被表 B 中的 20 替换?而 var2 按预期工作?

我知道我可以简单地使用 proc SQL 来完成此操作,这就是我解决问题的方法。但我仍然很好奇是否有办法使用合并来做我想做的事情?为什么这不起作用?在这种情况下,我更喜欢合并而不是 SQL,因为逻辑更容易实现(直到我发现这不能正常工作)。

我使用 SAS 9.4。

最佳答案

这与 SAS 在合并期间迭代数据集的方式有关。基本上,每个 A 的第二条记录不会与 B 的记录对齐。VAR2 的值是从前一条记录结转的。 VAR1 从 A 获取值(因为没有 B)。

IF B 中存在 EVERY ID1 的记录,那么您可以像这样重写合并以实现您想要的效果。

/* merge A&B to overwrite var1 in table A using values in table B */
data c;
merge a(drop=var1) b;
by id1;
run;

这会删除 A 中的 VAR1,以便将其从 B 中的记录中向下移走。

否则您将需要更复杂的逻辑(我可以建议使用 coalesce() 函数进行 SQL 左连接吗?)。

关于SAS 合并数据集以覆盖值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28845439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com