楼主: dxystata
2445 10

如何解决,谢谢! [推广有奖]

版主

已卖: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 发表于 2012-11-24 10:35:35 |AI写论文
200论坛币
%MACRO AAA;
    %LET HEAD=组别\N\疗前-疗后<DBar±SD 95%CI>\组内比较<统计量P>\两组差值^n均数之差(95%CI)\组间比较<统计量 P>;
%LET Head=%Sysfunc(Trim(&Head.));
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead= %SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\))));
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%AAA;

/*下面的程序如何实现和AAA的结果相同,不出现Warning*/
/* 不同之处是上面是中文状态下的%和(),我希望是英文状态下得%和(),如何对下面的程序进行修改 */
%MACRO AddTitleHeadInitContent();
%GLOBAL
gcTitleHeadB2
gcTitleHeadC2
gnCILevel
;
%let gnCILevel=95;
%LET gcTitleHeadB2=%QUOTE(
   指标\条件\组别\缺失\n\Mean±SD\&gnCILevel.%nrstr(%%)CI\M(Q1~Q3)\Min~Max\统计量\P,
   );
%LET gcTitleHeadC2=%QUOTE(
  时间\中心\组别\n\疗前-疗后<DBar±SD &gnCILevel.%nrstr(%%)CI>\组内比较<统计量 P>\两组差值^n均数之差(&gnCILevel.%nrstr(%%)CI)\组间比较<统计量 P>,
  );
%mend;
%AddTitleHeadInitContent();

%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%Sysfunc(Trim(&Head.));
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead= %SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\))));
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%bbb;


关键词:position sysfunc Quote Index while 计算机语言 主题 如何

本帖被以下文库推荐

沙发
Imasasor 发表于 2012-11-24 10:35:36
  1. %MACRO AAA;
  2.     %LET HEAD=组别\N\疗前-疗后<DBar±SD 95%CI>\组内比较<统计量P>\两组差值^n均数之差(95%CI)\组间比较<统计量 P>;
  3. %LET Head=%Sysfunc(Trim(&Head.));
  4. %PUT &HEAD;
  5. %LET I=1;
  6. %LET Head1List=;
  7. %LET Head1Position=;
  8. %LET Head2List=;
  9. %LET Head2Position=;
  10. %DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  11.   %LET MainHead= %SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\))));
  12.          %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
  13.             %PUT &MainHead;
  14.    %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
  15.     %LET Head1List=%STR(&head1List.,&MainHead.);
  16.    %END;
  17.    %ELSE %DO;
  18.     %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
  19.     %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
  20.     %LET Head1List=%STR(&head1List.,&MainHead.);
  21.    %END;
  22.   %LET I=%EVAL(&I.+1);
  23. %END;
  24. %LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
  25.     %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
  26. %PUT &Head1List;
  27. %MEND;
  28. %AAA;

  29. /*下面的程序如何实现和AAA的结果相同,不出现Warning*/
  30. /* 不同之处是上面是中文状态下的%和(),我希望是英文状态下得%和(),如何对下面的程序进行修改 */
  31. %MACRO AddTitleHeadInitContent();
  32. %GLOBAL
  33. gcTitleHeadB2
  34. gcTitleHeadC2
  35. gnCILevel
  36. ;
  37. %let gnCILevel=95;
  38. %LET gcTitleHeadB2=%QUOTE(
  39.    指标\条件\组别\缺失\n\Mean±SD\&gnCILevel.%nrstr(%%)CI\M(Q1~Q3)\Min~Max\统计量\P,
  40.    );
  41.    %put &gctitleheadb2;
  42. %LET gcTitleHeadC2=%QUOTE(
  43.   时间\中心\组别\n\疗前-疗后<DBar±SD &gnCILevel.%nrstr(%%)CI>\组内比较<统计量 P>\两组差值^n均数之差(&gnCILevel.%nrstr(%%)CI)\组间比较<统计量 P>,
  44.   );
  45.   %put &gctitleheadc2;
  46. %mend;
  47. %AddTitleHeadInitContent();

  48. %MACRO bbb(head=&gcTitleHeadB2);
  49. %LET Head=%nrbquote(%Sysfunc(Trim(%nrstr(&Head))));          /*modified*/
  50. %PUT &HEAD;
  51. %LET I=1;
  52. %LET Head1List=;
  53. %LET Head1Position=;
  54. %LET Head2List=;
  55. %LET Head2Position=;
  56. %DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  57. /*  %LET MainHead= %nrbquote(%SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\)))));*/ /*delete*/
  58. %let mainhead=%nrbquote(%qscan(&head,&i,\));  /*modified*/
  59.          %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
  60.             %PUT &MainHead;
  61.    %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
  62.     %LET Head1List=%STR(&head1List.,&MainHead.);
  63.    %END;
  64.    %ELSE %DO;
  65.     %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
  66.     %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
  67.     %LET Head1List=%STR(&head1List.,&MainHead.);
  68.    %END;
  69.   %LET I=%EVAL(&I.+1);
  70. %END;
  71. %LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
  72.     %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
  73. %PUT &Head1List;
  74. %MEND;
  75. %bbb;
复制代码
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 100 热心帮助其他会员
数据分析师3K + 20 + 3 + 3 + 3 热心帮助其他会员
webgu + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 120  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

藤椅
webgu 发表于 2012-11-24 14:13:47
%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%nrbquote(%Sysfunc(Trim(%nrstr(&Head.)))); /原来有两个陷阱啊/
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead=%nrbquote( %SYSFUNC(TRIM(%QSCAN(&Head.,&I.,%STR(\))))); /*问题出在哪儿????? */
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;

%bbb( );

这个有点BUG.楼上的可用。
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 36 + 60 + 1 + 1 + 1 分析的有道理

总评分: 经验 + 36  论坛币 + 60  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

板凳
webgu 发表于 2012-11-24 14:42:56
webgu 发表于 2012-11-24 14:13
这个有点BUG.楼上的可用。
QSCAN()改得很巧妙。原来罪魁祸首在此。
为什么用了DATA步函数TRIM后就出问题?
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

报纸
dxystata 发表于 2012-11-24 15:59:30
webgu 发表于 2012-11-24 14:13
%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%nrbquote(%Sysfunc(Trim(%nrstr(&Head.)))); /*原来有两个陷阱啊*/
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead=%nrbquote( %SYSFUNC(TRIM(%QSCAN(&Head.,&I.,%STR(\))))); /*问题出在哪儿????? */
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;

%bbb( );
还是有点问题,WARNING: 没有解析宏 CI 的调用。

地板
webgu 发表于 2012-11-24 16:42:53
dxystata 发表于 2012-11-24 15:59
还是有点问题,WARNING: 没有解析宏 CI 的调用。
嗯,蓝色部分代码问题,我没有figure it out。二楼的代码可以用。
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

7
webgu 发表于 2012-11-24 17:15:07
dxystata 发表于 2012-11-24 15:59
还是有点问题,WARNING: 没有解析宏 CI 的调用。
%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%nrbquote(%QTrim(&Head));          /*use %QTRIM FUNCTION*/
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
%LET MainHead= %nrbquote(%QTRIM(%QSCAN(&head,&i,\)) ); /*use %QTRIM FUNCTION*/
            %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%bbb;
IMasasor的代码,已经完美的解闪了问题。怀着对蓝色部分代码的好奇,我
据IMasasor的代码,稍微做了些修改。
1.要mask 解析后的%CI,可以直接用%qtrim() function.
2.  macro funtion可以在macro里直接用,不需要套在 %sysfunc()里。
3 我对macro 的mask一直心存畏惧。




已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
数据分析师3K + 60 + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 论坛币 + 60  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

8
dxystata 发表于 2012-11-24 22:51:47
Imasasor 发表于 2012-11-24 14:06
%MACRO AAA;
    %LET HEAD=组别\N\疗前-疗后<DBar±SD 95%CI>\组内比较<统计量P>\两组差值^n均数之差(95%CI)\组间比较<统计量 P>;
%LET Head=%Sysfunc(Trim(&Head.));
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead= %SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\))));
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%AAA;

/*下面的程序如何实现和AAA的结果相同,不出现Warning*/
/* 不同之处是上面是中文状态下的%和(),我希望是英文状态下得%和(),如何对下面的程序进行修改 */
%MACRO AddTitleHeadInitContent();
%GLOBAL
gcTitleHeadB2
gcTitleHeadC2
gnCILevel
;
%let gnCILevel=95;
%LET gcTitleHeadB2=%QUOTE(
   指标\条件\组别\缺失\n\Mean±SD\&gnCILevel.%nrstr(%%)CI\M(Q1~Q3)\Min~Max\统计量\P,
   );
   %put &gctitleheadb2;
%LET gcTitleHeadC2=%QUOTE(
  时间\中心\组别\n\疗前-疗后<DBar±SD &gnCILevel.%nrstr(%%)CI>\组内比较<统计量 P>\两组差值^n均数之差(&gnCILevel.%nrstr(%%)CI)\组间比较<统计量 P>,
  );
  %put &gctitleheadc2;
%mend;
%AddTitleHeadInitContent();

%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%nrbquote(%Sysfunc(Trim(%nrstr(&Head))));          /*modified*/
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
/*  %LET MainHead= %nrbquote(%SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\)))));*/ /*delete*/
%let mainhead=%nrbquote(%qscan(&head,&i,\));  /*modified*/
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%bbb;

9
hopewell 发表于 2012-11-26 09:32:57
  1. %MACRO AddTitleHeadInitContent();
  2.     %GLOBAL gcTitleHeadB2 gcTitleHeadC2 gnCILevel;
  3.     %LET gnCILevel=95;
  4.     %LET gcTitleHeadB2=N\XXX<DBar±SD 95%NRSTR(%%)CI>\n\Mean±SD\&gnCILevel%NRSTR(%%)CI\M(Q1~Q3)\Min~Max\YYY<P>;
  5.     %PUT WARNING-%NRSTR(&gcTitleHeadB2): &gcTitleHeadB2;
  6. %mend;
  7. %AddTitleHeadInitContent();

  8. %MACRO bbb(head=&gcTitleHeadB2);
  9.     %LET Head=%QCMPRES(&Head);
  10.     %PUT ERROR-%NRSTR(&HEAD): &HEAD;
  11.     %LET I=1;
  12.     %LET Head1List=;
  13.     %DO %WHILE(%QSCAN(%SUPERQ(Head),&I,%STR(\ <>)) NE %STR());
  14.         %LET MainHead=%QCMPRES(%QSCAN(%SUPERQ(Head),&I,%STR(\ <>)));
  15.         %PUT WARNING- %NRSTR(&MainHead) #&I: %SUPERQ(MainHead);
  16.             %IF &head1List NE %THEN %LET Head1List=%STR(&head1List,&MainHead);
  17.             %ELSE %LET Head1List=&MainHead;
  18.         %LET I=%EVAL(&I+1);
  19.     %END;
  20.     %PUT ERROR- %NRSTR(&Head1List): &Head1List;
  21. %MEND;
  22. %bbb;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
webgu + 1 + 1 + 1 Macro到这种程度,就得看hopewell

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

观钓颇逾垂钓趣 种花何问看花谁

10
pingguzh 发表于 2012-11-26 09:56:13
对你们只有敬仰之情
统计爱好

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 22:08