这也许是一个简单的问题,但我只是想不出解决方案。
现在我有一个名字说
%let name=helen mark anne lili;
现在我想在每个名称的末尾添加数字2,我希望从中获得
new_name = helen2 mark2 anne2 lili2
我尝试使用CAT功能,但是没有用
%let new=cat(&name.,'2');
有人可以帮我吗?谢谢!
答案 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表示单词边界,后跟字母。