楼主: ihust
2906 18

[问答] 用宏分割数据集 [推广有奖]

  • 3关注
  • 2粉丝

博士生

47%

还不是VIP/贵宾

-

威望
0
论坛币
10339 个
通用积分
0.0600
学术水平
2 点
热心指数
3 点
信用等级
2 点
经验
2776 点
帖子
250
精华
0
在线时间
159 小时
注册时间
2012-4-29
最后登录
2016-9-8

10论坛币
假设我有如下数据集:

var1   var2
A1      10
B2      22
C1      25
A1      30
A2      22
C1     30
......

这个数据集总共有十多万条观测,我现在想根据var1变量的值来分割,即var1的值相同的观测各自成为一个数据集,并把新生成的数据集根据各自的var1的值,分别命名为data_A1、data_B2、data_c1....

这个如何实现呢?

最佳答案

Eternal0601 查看完整内容

data raw; input var1:$8. var2; datalines; A1 10 B2 22 C1 25 A1 30 A2 22 C1 30 ; run; proc sql noprint; create table vlist as select distinct var1 from raw order by var1; quit; data _null_; set vlist; call execute('data data_' ||strip(var1) ||';'); call execute('set raw;'); call execute('where var1="'||strip(var1)||'";'); call ex ...
关键词:数据集 Data 分别命名 如何实现 VaR 命名 如何
沙发
Eternal0601 发表于 2013-8-12 15:21:30 |只看作者 |坛友微信交流群

data raw;
        input var1:$8.   var2;
datalines;
A1      10
B2      22
C1      25
A1      30
A2      22
C1      30
;
run;


proc sql noprint;
        create table vlist as
        select distinct var1 from raw
        order by var1;
quit;

data _null_;
        set vlist;
        call execute('data data_' ||strip(var1) ||';');
        call execute('set raw;');
        call execute('where var1="'||strip(var1)||'";');
        call execute('run;');
run;

使用道具

藤椅
liprayer 发表于 2013-8-12 15:32:10 |只看作者 |坛友微信交流群
问题的描述好像不是很清楚啊!
人随缘 事随心

使用道具

板凳
ihust 发表于 2013-8-12 16:10:50 |只看作者 |坛友微信交流群
liprayer 发表于 2013-8-12 15:32
问题的描述好像不是很清楚啊!
哪里不清楚

使用道具

报纸
beijingdizheng 发表于 2013-8-12 16:53:15 |只看作者 |坛友微信交流群
如果var1不同的取值太多的话可以用下面的方法
data data;
input var1 $ var2 @@;
cards;
A1      10
B2      22
C1      25
A1      30
A2      22
C1     30
A2     500

;
run;
%macro xiang/parmbuff;
proc sort data=data out=data2 nodupkey;
by var1;
run;
data data2;
set data2;
id=1;
run;
data _null_;
set data2;
length var3$ 400;
by id;
retain var3;
if first.id then var3=var1;
else var3=catx(',',var1,var3);
call symput('xx',var3);
run;

%let i=1;
%do %while(%scan(&syspbuff,&i) ne);
%let var=%scan(&syspbuff,&i);
data data&var;
set data;
if var1="&var";
run;

%let i=%eval(&i+1);
%end;
%mend;
%xiang(&xx)

使用道具

地板
hsaotsud 发表于 2013-8-12 20:25:00 |只看作者 |坛友微信交流群
  1. %macro na;
  2.     proc sql noprint;
  3.         select count(distinct(var1)) into :cnt from raw;
  4.         select distinct(var1) into :var1 - from raw;
  5.     quit;
  6.     %do i = 1 %to &cnt;
  7.         proc sql;
  8.             create table data_&&var&i as
  9.                 select *
  10.                     from raw
  11.                     where var1="&&var&i";
  12.         quit;
  13.     %end;
  14. %mend na;

  15. %na
复制代码

使用道具

7
ihust 发表于 2013-8-12 22:06:23 |只看作者 |坛友微信交流群
Eternal0601 发表于 2013-8-12 15:21
data raw;
        input var1:$8.   var2;
datalines;
好!通俗易懂,完全符合我的预期!

使用道具

8
fossilweng 发表于 2013-8-12 23:11:17 |只看作者 |坛友微信交流群
I once used a macro similar beijingdizheng's. Now feel Eternal0601's method is way better.

Thanks, Eternal0601!

使用道具

9
bobguy 发表于 2013-8-13 10:46:28 |只看作者 |坛友微信交流群
Eternal0601 发表于 2013-8-12 15:21
data raw;
        input var1:$8.   var2;
datalines;
The solution is very inefficient if many data sets needs to be generated.

I give a hint here,

data_a data_b data_c ....;
  set raw;
  if var1='a' then output data_a;
  else if var1='b' then output data_b;
  else if var1='c' then output data_c;
  ....
;
run;

in this way, it only reads input data set once.

使用道具

10
ihust 发表于 2013-8-13 19:03:06 |只看作者 |坛友微信交流群
bobguy 发表于 2013-8-13 10:46
The solution is very inefficient if many data sets needs to be generated.

I give a hint here,
...
I have concerned this method, but if var1 have many values, I should write so many if statements, so I think about macro to solve this problem.

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 19:43