如何用SAS Data Step保留指定数据集列及合并两表指定列
嘿,我来帮你搞定这两个SAS Data Step的问题,一步步给你讲清楚!
1. 用Data Step从指定数据集保留某一列
要在Data Step里只保留某一列,最直接的方式就是用keep语句,要是原数据集列特别多,用drop语句排除其他列反而更省事。
举个例子,假设你有个原数据集叫source_data,想只保留target_column这一列:
data retained_data; set source_data; /* 读取原数据集 */ keep target_column; /* 指定要保留的列 */ run;
如果原数据集列很多,用drop语句反向操作:
data retained_data; set source_data; drop _all_; /* 先排除所有列 */ keep target_column; /* 再保留需要的列 */ run;
小提示:keep语句可以放在Data Step的任意位置,但习惯上放在set语句之后,逻辑会更清晰。
2. 用Data Step合并两个表生成目标表Required
先纠正你提供的代码片段问题:直接用set table_1 table_2是纵向拼接(把两个表的行上下叠加),这没法实现你要的“按ID匹配,取table_1的column_1和table_2的column_4”的需求。正确的做法是用merge语句进行横向关联。
步骤说明:
- 确保两个表都按
ID排序(SAS的merge按by变量关联时,要求数据集已排序) - 用
merge语句同时读取两个表,指定只保留需要的列 - 按
ID关联,可选过滤只保留匹配成功的记录
完整示例代码:
首先如果你的表还没按ID排序,先做排序(用proc sort比Data Step排序更高效):
proc sort data=table_1 out=table_1_sorted; by ID; run; proc sort data=table_2 out=table_2_sorted; by ID; run;
然后进行合并:
data required; /* 读取时就只保留需要的列,减少内存占用 */ merge table_1_sorted (keep=ID column_1) table_2_sorted (keep=ID column_4); by ID; /* 按ID进行关联匹配 */ /* 可选:只保留在两个表都存在对应ID的记录 */ /* 如果要保留所有ID(包括只在一个表中的),删掉下面这行即可 */ if _merge_ = 3; run;
代码解释:
(keep=ID column_1)是数据集选项,在读取table_1_sorted时就只提取ID和column_1,比先读全表再keep更高效by ID指定按ID关联两个表,SAS会自动匹配相同ID的记录_merge_是SAS合并时自动生成的变量:- 值为1:记录只来自第一个表(table_1)
- 值为2:记录只来自第二个表(table_2)
- 值为3:记录同时来自两个表(匹配成功)
加if _merge_=3;可以只保留两边都有对应ID的记录,完全符合你示例中的需求。
内容的提问来源于stack exchange,提问作者Azeem112
相关产品推荐
相关产品推荐

