楼主: ihust
3670 18

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

  • 3关注
  • 2粉丝

已卖:315份资源

博士生

46%

还不是VIP/贵宾

-

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

楼主
ihust 发表于 2013-8-12 15:21:29 |AI写论文
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
拉您进交流群
GMT+8, 2025-12-29 00:01