使用数据表中的值命名列

时间:2018-02-14 20:43:42

标签: sas

假设我有两列A和B列。

A     B
12    "randstr"
39    "randstr"
2     "randstr"

每行重复此随机字符串。

我对如何获得下表感兴趣:

randstr     B
12          "randstr"
39          "randstr"
2           "randstr"

B列中的值用于重命名A列。我尝试使用rename和各种宏魔法但失败了。我不知道如何继续。

我已尝试过以下答案,他们只是不允许从数据中读取值,然后将值用作列名:

  1. https://communities.sas.com/t5/General-SAS-Programming/dates-used-as-column-names/td-p/168803
  2. https://stats.idre.ucla.edu/sas/code/a-few-sas-macro-programs-for-renaming-variables-dynamically/
  3. SAS - Dynamically create column names using the values from another column
  4. Renaming Column with Dynamic Name

2 个答案:

答案 0 :(得分:1)

这种转变也可以看作是一种逐行转换。

data have;
attrib A length=8 B length=$32;
row+1;
input
A   & B; datalines;
12    xyz-123-abc
39    xyz-123-abc
2     xyz-123-abc
run;

proc transpose data=have out=want(drop=row _name_);
  by row;
  var A;
  id B;
  copy B;
run;

在非玩具场景中,B列通常不是单个值。尝试使用B变体的数据进行相同的转置。该过程将根据B的值创建两个新列。

A   & B; datalines;
12    xyz-123-abc
39    xyz-123-abc
2     xyz-123-abc
3141  xyz-456-def

答案 1 :(得分:0)

使用此macro,它非常简单:

/* get first value in the dataset */
%let new_col=%mf_getvalue(work.YOURDATA,B);

/* rename variable A */
proc datasets library=work nolist;
 modify YOURDATA;
 rename A=%sysfunc(dequote(&new_col));
quit;