通过变量修改多个观察值
modify multiple observations in a by variable
data a1
col1 col2 flag
a 2 .
b 3 .
a 4 .
c 1 .
对于数据 a1
,flag
始终缺失。我想使用 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;
data a1
col1 col2 flag
a 2 .
b 3 .
a 4 .
c 1 .
对于数据 a1
,flag
始终缺失。我想使用 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;