通过变量修改多个观察值

modify multiple observations in a by variable

data a1

col1 col2 flag
a    2    .
b    3    .
a    4    .
c    1    .

对于数据 a1flag 始终缺失。我想使用 a2.

更新多行
data a2

col1 flag
a    1

理想输出:

col1 col2 flag
a    2    1
b    3    .
a    4    1
c    1    .

但这不会更新 by 语句中的所有记录。

data a1;
modify a1 a2;
by col1;
run;

已编辑问题

实际上a1是服务器上的一个非常大的数据集。因此我更愿意修改它(如果可能的话)而不是创建一个新的。否则我必须先删除以前的 a1 并从本地复制一个新的 a1 到服务器,这将花费更多时间。

如果您不使用 Merge 语句来解决排序问题,您只需更改合并方法即可。 如果 A1 中的 flag 总是丢失,你可以删除它,否则你应该临时重命名它,以免丢失这些信息。 这里我将使用哈希对象合并 A1 和 A2,这种方法不需要对数据集进行任何预先排序。

data final_merged(drop = finder);
length flag 8.; /*please change length with the real one, use $ if char*/
if _N_ = 1 then do;
            declare hash merger(dataset:'A2');
            merger.definekey('col1');
            merger.DefineData ('flag');
            merger.definedone();
end;
set A1(drop=flag);
finder = merger.find();
if finder ne 0 then flag = .; 
/*then flag='' or then flag='unknown' as you want if flag is a character var*/
run;

请告诉我这是否有帮助。

您可以执行以下操作,但 SQL 对观察结果进行排序,因此不确定这对您有多大用处? (您总是可以使用 ordvar=_n_; 进行预处理,然后在有帮助的情况下对 SQL 语句进行排序):

数据:

data a1 ;
input col1 $ col2 flag ;
cards ;
a 2 .
b 3 .
a 4 .
c 1 .
;run ;

data a2 ;
input col1 $ flag ;
cards ;
a 1 
;run ;

合并:

proc sql ;
create table output as
  select a.col1, a.col2, b.flag
  from a1 a
  left join
  a2 b
  on a.col1=b.col1
;quit ;

要尝试一次性完成,创建两个包含来自 a2 的映射的宏变量如何?

proc sql ;
select distinct col1, flag
into :colvals separated by '', :flagvals separated by ''
from a2
;quit ;

将flag设置为两个宏变量之间对应的字符位置:

data a1 ;
  set a1 ;
  if findc("&colvals",col1) then 
    flag=input(substr("&flagvals", findc("&colvals",col1),1),8.) ;
run ;

如果您想使用 MODIFY 执行此操作,则必须以某种方式遍历修改数据集,否则它只会替换第一行(因为其他数据集将 运行 超出记录 - 通常这就像合并一样,一旦找到匹配项,它就会前进到下一条记录)。这是一个选项 - 还有其他选项。

data a1(index=(col1));
  input col1 $ col2 flag;
datalines;
a    2    .
b    3    .
a    4    .
c    1    .
;;;;
run;

data a2(index=(col1));
  col1='a'; 
  flag=1;
run;

data a1;
    set a2(rename=flag=flag2);
    do _n_ = 1 to nobs_a1;
      modify a1 key=col1 nobs=nobs_a1;
      if _iorc_=0 then do;
        flag=flag2;
        replace;
      end;
    end;
    if _iorc_=%sysrc(_DSENOM) then _error_=0;
run;