从多个变量中删除前缀

Posted

技术标签:

【中文标题】从多个变量中删除前缀【英文标题】:Delete prefix from multiple variables 【发布时间】:2018-04-16 03:43:41 【问题描述】:

我有一个数据集“Dairy1”,其中变量标记为“240、241、242 ...”,但实际名称为“_240、_241、_242 ...”。

如何从所有这些变量的名称中删除前缀“_”?我尝试在 SAS 9.4 中使用以下代码,但它不起作用。

**proc sql noprint;
select cats(name,'=',scan(name, 1, '_'))
into :suffixlist
separated by ' '
from dictionary.columns
where libname = 'WORK' and memname = 'Dairy1' and '240' = scan(name, 2, '_');
quit;
%put &suffixlist.;
data want;
set Dairy1;
rename &suffixlist.;
run;**

它显示了以下内容:

警告:未解析明显的符号引用后缀列表。 错误 22-322:语法错误,期待以下之一:un nombre, ;.

提前致谢

【问题讨论】:

我说的对吗,你可以使用 SQL SERVER 代码吗? 不知道怎么用 this '240' = scan(name, 2, '_') 似乎不对 SAS 变量名不能以数字开头。 【参考方案1】:

我以相反的方式做了类似的解决方案,它为变量添加了后缀。 这样做是创建单个字符串,其中包含所有变量重命名命令。

请注意,这有点愚蠢,因为它会删除所有字符。只需在 data sjm_tmp2 中修改逻辑以满足您的需要。

%macro remove_str(Dataset, str);

    proc contents noprint
        data=work.&dataset out=sjm_tmp(keep=NAME);
    run;

    data sjm_tmp2;
        set sjm_tmp;
        help= tranwrd(NAME, "&str.", '');
        foobar=cats(name, '=',help);
    run;

    proc sql noprint;
        select foobar into :sjm_list separated by ' ' from sjm_tmp2;
    quit;

    proc datasets library = work nolist;
       modify &dataset;
       rename &sjm_list;
    quit;

    proc datasets library=work noprint;  
        delete sjm_tmp sjm_tmp2 ;  
    run;

%mend;

用代码测试:

data test; 
    _a=1; 
    _b=1; 
    _c=1; 
    _d=1; 
    _e=1; 
    _f=1; 
run;

%remove_str(test, _);

【讨论】:

虽然此解决方案适用于以下划线后跟字母字符开头的变量,但它不适用于给出的示例,也没有任何解决方案,因为 SAS 变量不能以一个数字。 @ChrisJ 哦。你是对的。好吧,那我看不到直接的答案。使用经过测试的设置它可以正常工作,所以我会把它留在那里供某人在某个日期使用。

以上是关于从多个变量中删除前缀的主要内容,如果未能解决你的问题,请参考以下文章

禁用 RPC 时如何在远程服务器上删除具有多个前缀的永久表

在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号

有效地指定具有相同前缀的多个列名称

Laravel 5.0.* 中间件在处理路由之前从 url 中删除前缀语言环境

如何将数据从多个视图传递到一个?

字符串在特定字符前添加或者删除前缀