sas transpose

Nombres de columnas seguras SAS



transpose (5)

¿Hay alguna manera simple en SAS de convertir una cadena en un nombre seguro para SAS que se usaría como nombre de columna?

es decir.

Rob Penridge ----> Rob_Penridge $*@''Blah@* ----> ____Blah__

Estoy usando una proc transpose y luego quiero trabajar con las columnas renombradas después de la transposición.


¿Qué hay de usar la funcionalidad de regular expression de SAS? Por ejemplo:

data names; set name; name_cleaned = prxchange(''s/[^a-z0-9 ]/_/i'', -1, name); run;

Esto convertirá cualquier cosa que no sea una letra, número o espacio en un _ . Puede agregar otros caracteres que quiera permitir a la lista después del 9 . Solo tenga en cuenta que algunos caracteres son "especiales" y deben estar precedidos por un / .


Eche un vistazo a la opción del sistema VALIDVARNAME . Podría permitirle aceptar nombres de SAS no válidos.

Además, la función NOTNAME podría facilitar la búsqueda de caracteres no válidos.


Puede probar la función de expresión regular perl. Dado que para el nombre de columna, el primer carácter no debe ser numérico, es más complicado entonces.

data _null_; name1 = "1$*@'' Blah1@*"; name2 = prxchange("s/[^A-Za-z_]/_/",1,prxchange("s/[^A-Za-z_0-9]/_/",-1,name1)); put name2; run;


También puede usar la instrucción IDLABEL en la transposición para agregar etiquetas que coincidan con los valores originales. Luego use la función VARLABEL para recuperar las etiquetas y trabajar con ellas de esa manera.


proc transpose tomará esos nombres sin ninguna modificación, siempre y cuando establezca las options validvarname=any;

Si luego desea trabajar con las columnas, puede usar la función NLITERAL para construir literales con nombre que se pueden usar para referirse a ellos:

options validvarname=any; /* Create dataset and transpose it */ data zz; var1 = "Rob Penridge"; var2 = 5; output; var1 = "$*@''Blah@*"; var2 = 100; output; run; proc transpose data = zz out = zz_t; id var1; run; /* Refer to the transposed columns in the dataset using NLITERAL */ data _null_; set zz; call symput(cats("name", _n_), nliteral(var1)); run; data blah; set zz_t; &name1. = &name1. + 5; &name2. = &name2. + 200; run;