楼主: dxystata
3953 14

将aaa1和aaa2根据分开,得到新数据集 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2014-1-20 07:43:37 |AI写论文
200论坛币
  1. %let aaa1=m!!c!;
  2. %let aaa2=!p!q!;

  3. data aaa;
  4. input x$ y$ z$;
  5. cards;
  6. a b c
  7. d e f
  8. ;
  9. run;
复制代码
将aaa1和aaa2根据!分开然后插在aaa数据集前面,
希望得到的数据集为:
m   c
   p q
a  b c
d  e f

最佳答案

pobel 查看完整内容

data bbb; if 0 then set aaa; array tmp $ _all_; If _N_=1 then do; aaa1=tranwrd("&aaa1","!"," !"); do i=1 to dim(tmp); tmp(i)=scan(aaa1,i,"!"); end; output; aaa2=tranwrd("&aaa2","!"," !"); do i=1 to dim(tmp); tmp(i)=scan(aaa2,i,"!"); end; output; end; set aaa; output; drop aaa1 aaa2 i; run;
关键词:数据集 cards Input card Data 如何

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2014-1-20 07:43:38
data bbb;
    if 0 then set aaa;
        array tmp $ _all_;
        If _N_=1 then do;
            aaa1=tranwrd("&aaa1","!"," !");
                do i=1 to dim(tmp);
                   tmp(i)=scan(aaa1,i,"!");
                end;
                output;
            aaa2=tranwrd("&aaa2","!"," !");
                do i=1 to dim(tmp);
                   tmp(i)=scan(aaa2,i,"!");
                end;
                output;
        end;
        set aaa;
        output;
        drop aaa1 aaa2 i;
run;
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 3 + 3 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 3  热心指数 + 3   查看全部评分

和谐拯救危机

藤椅
dengrong1989 发表于 2014-1-20 09:31:06
%let aaa1=m! !c!;
%let aaa2=! !p!q!;

data aaa;
input x$ y$ z$;
cards;
a b c
d e f
;
run;
data bbb;
x=scan("&aaa1",1,'!');
y=scan("&aaa1",2,'!');
z=scan("&aaa1",3,'!');
output;
x=scan("&aaa2",1,'!');
y=scan("&aaa2",2,'!');
z=scan("&aaa2",3,'!');
output;
run;
data ccc;
set bbb aaa;
run;

具体问题我不是很清楚,简单的写了下,aaa1和aaa2我加了个空格  不然读不了
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

板凳
dxystata 发表于 2014-1-20 11:20:13
程序不通用啊!

报纸
dxystata 发表于 2014-1-20 11:33:47
  1. %let aaa1=m!!c!d!;
  2. %let aaa2=!p!q!w!;

  3. data aaa;
  4. input x$ y$ z$ z1$;
  5. cards;
  6. a b c d
  7. d e f g
  8. ;
  9. run;
复制代码

地板
dxystata 发表于 2014-1-20 11:34:25
希望得到的数据集为:
m   c d
   p q w
a  b c d
d  e f g

7
dxystata 发表于 2014-1-20 19:32:34
pobel 发表于 2014-1-20 13:20
data bbb;
    if 0 then set aaa;
        array tmp $ _all_;
        If _N_=1 then do;
            aaa1=tranwrd("&aaa1","!"," !");
                do i=1 to dim(tmp);
                   tmp(i)=scan(aaa1,i,"!");
                end;
                output;
            aaa2=tranwrd("&aaa2","!"," !");
                do i=1 to dim(tmp);
                   tmp(i)=scan(aaa2,i,"!");
                end;
                output;
        end;
        set aaa;
        output;
        drop aaa1 aaa2 i;
run;
谢谢pobel兄!

能否再macro中实现
%macro a(dset=,out=);


%end;

如果在macro之前只指定&aaa1,就在数据集前面加1行&aaa1分解的值。
%let aaa1=m!!c!;
%a(dset=aaa,out=bbb);

如果&aaa2也指定,就在数据集前面加2行,其中第1行为&aaa1分解的值,第2行为&aaa2分解的值
%let aaa1=m!!c!;
%let aaa2=!p!q!;
%a(dset=aaa,out=bbb);

=======================================
先运行
%let aaa1=m!!c!;
%let aaa2=!p!q!;
%a(dset=aaa,out=bbb);

再运行
%let aaa1=m!!c!;
%a(dset=ccc,out=ddd);

前一段对后一段的运行没有影响。
=======================================
在调用%a之前,最多会设置4个:
%let aaa1=;
%let aaa2=;
%let aaa3=;
%let aaa4=;






8
pobel 在职认证  发表于 2014-1-21 08:32:25
%macro test(dset=aaa,out=bbb);
data &out;
    if 0 then set &dset;
        array tmp $ _all_;
        If _N_=1 then do;
                   %do j=1 %to 4;
                      %if %symexist(aaa&j) %then %do;
                    aaa=tranwrd("&&aaa&j","!"," !");
                        do i=1 to dim(tmp);
                           tmp(i)=scan(aaa,i,"!");
                        end;
                        output;
                                %end;
                   %end;
        end;
        set &dset;
        output;
        drop aaa i;
run;
%mend;

%let aaa1=m!!c!d!;
%let aaa3=!p!q!w!;

data aaa;
input x$ y$ z$ z1$;
cards;
a b c d
d e f g
;
run;

%test()
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
zw612003 + 1 + 1 + 1 虚心学习
dxystata + 100 + 2 + 2 精彩帖子

总评分: 经验 + 100  学术水平 + 3  热心指数 + 3  信用等级 + 1   查看全部评分

和谐拯救危机

9
farmman60 发表于 2014-1-21 08:39:53

data aaa;
input x$ y$ z$ z1$;
cards;
a b c d
d e f g
;
run;

option mlogic mprint symbolgen;
%macro merge (aaa1,aaa2,indsn,outdsn);
%let aaa1=m!!c!d!;
%let aaa2=!p!q!w!;

filename myfile 'c:\temp.csv' ;
data _null_;
file myfile;
_file_=" &aaa1   &aaa2 ";
put dummy1 ;
run;

   proc sql noprint;
     select cats(name,'$') into: vars separated by ' ' from dictionary.columns where libname='WORK' and memname=upcase("&indsn");
   quit;

   data &outdsn;
   infile 'c:\temp.csv' dlm='!'  dsd  ;
   input &vars @@;
   run;
   proc append base=&outdsn data=&indsn force;
run;

%mend;

%merge(aaa1,aaa2,aaa,want)
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 好的意见建议

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

10
dxystata 发表于 2014-1-21 09:16:20
%let aaa1=m!!c!d!;
%let aaa2=!p!q!w!;
放在macro外的!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 06:59