SAS将数字连接到字符串中列出的每个项目

时间:2018-10-30 15:53:12

标签: sas

这也许是一个简单的问题,但我只是想不出解决方案。

现在我有一个名字说

%let name=helen mark anne lili;

现在我想在每个名称的末尾添加数字2,我希望从中获得

new_name = helen2 mark2 anne2 lili2

我尝试使用CAT功能,但是没有用

%let new=cat(&name.,'2');

有人可以帮我吗?谢谢!

5 个答案:

答案 0 :(得分:2)

对于 list 正确定界和隔开的情况,可以使用TRANSTR

%let name=helen mark anne lili;
%let name2 = %sysfunc(transtrn(&name%str( ),%str( ),2%str( )));

%put &=name;
%put &=name2;

日志

NAME=helen mark anne lili
NAME2=helen2 mark2 anne2 lili2

答案 1 :(得分:1)

一种选择是编写一个小宏以遍历单词并追加所需的数字:

%macro myloop(list, dlm=%str( ));
  %local i length;
  %let length = 1;
  %let i = 1;
  %do %while(&length > 0);
    %let word = %scan(&list,&i,&dlm);
    %let length = %length(&word);
    %let i = %eval(&i + 1);
    %if &length %then
&word.2;
  %end;
%mend;

%let name=helen mark anne lili;
%put name = &name;

%let name2 = %myloop(&name);
%put name2 = &name2;

答案 2 :(得分:1)

这里更好的解决方案是返回几步并立即创建它们。

test_df.loc[250, ['B']]
#B    0
#Name: (200, 300], dtype: int64

test_df.loc[250:400, ['B', 'C']]
#            B  C
#(200, 300]  0  0
#(300, 400]  0  0

test_df.loc[250, ['B']] = 10
print(test_df)
#            A   B  C
#(100, 200]  0   0  0
#(200, 300]  0  10  0
#(300, 400]  0   0  0

答案 3 :(得分:1)

另一种方法是使用prxchange并调用symput。

prxchange的简要说明。 \ S +表示空格以外的任何内容

用$ 1 \ L2替换(\ S +)

$ 1第一个实例,我们不能添加$ 12(第12个位置,因此我必须保持$ 1和2之间的某个值,因此我有$ 1 \ L2 \ L表示较低,并且对占位符的影响更大,

>

-1表示尽可能多的次数

   %let    name = "helen mark anne lili";
   data names;
    new_name = prxchange('s/(\S+)/$1\L2/', -1, &name);
   call symput('new_name', new_name);
  run;

 %put &new_name;

答案 4 :(得分:1)

除了Kiran的解决方案之外,您实际上还可以使用100%宏代码来实现:

%let name=helen mark anne lili;
%put %qSysFunc(prxChange(s/(?<=\w)\b/2/, -1, %superQ(name)));

(?<= \ w)\ b表示单词边界,后跟字母。