Dividir en palabras un texto con SAS

Una duda que planteó una lectora del blog acerca de separar una cadena de caracteres separados por comas y crear observaciones en otra variable: Hola! he buscado por toda la página, necesito ayuda urgente. Mi problema es el siguiente. Necesito separar una cadena de texto en una fila en varias filas, por ejemplo cadena1,cadena2,cadena3 en cadena1 cadena2 cadena3 para encontrar la , utilizo scan, aunque podría ocupar anypunct para que encuentre la primera , luego la segunda , etc y cortar con substr, longth … pero bueno, ya que tengo un metodo de separar el texto de la fila como hago para que cada palabra este en una nueva fila? ojala me hayan entendido y me den una idea de como hacer eso en un proc sql, con una macro o como sea, solo una pequeña orientación me serviria mucho, gracias!!!!! ...

12 de septiembre de 2013 · rvaquerizo

Atentos a los intervalos de confianza

Un intervalo de confianza es la zona en la que me fío de lo que estimo. Cuanto más amplia es esa zona menos me fío de lo que estimo y cuanto más estrecha más me fío de lo que estimo. Lo que pasa es que un intervalo de confianza por definición empieza con la famosa expresión “dada una población de media nu y desviación típica sigma…” ¡¡¡FU FU FU FU FU FU!!! ...

26 de julio de 2013 · rvaquerizo

Trucos SAS. Lista de variables missing

Duda que me plantearon ayer por la tarde. Dada una serie de variables determinar que registro tiene todas esas variables nulas. El truco que planteo puede servir para determinar incluso cuantos valores perdidos tiene esa lista de variables, ese truco me le reservo para otro día. El código lo acompaño con un ejemplo para que se pueda ejecutar y analizar su funcionamiento: data aleatorio; do i=1 to 20000; aleat1=sqrt(rannor(45)); aleat2=sqrt(rannor(5)); aleat3=sqrt(rannor(4)); aleat4=sqrt(rannor(450)); aleat5=sqrt(rannor(40)); output; end; run; ```sas data fila_nula; set aleatorio; nulo=0; array varib(*) aleat1--aleat5; do j=1 to dim(varib); if not missing(varib(j)) then nulo=i; end; drop j; if nulo=0; run; Muy sencillo el truco. Si se encuentra alguna variable que no es nula la variable nulo ya no toma valor 0. Espero que os sea de utilidad. Saludos.

8 de marzo de 2013 · rvaquerizo

Truco SAS. Limpiar un fichero de texto con SAS

El otro día me llegó al correo la siguiente cuestión acerca de caracteres extraños en un fichero de texto y la importación a SAS: Tengo un problema a la hora de importar a SAS un fichero txt. El caso es que tiene en algunos registros el carácter «flechita». Ejemplo: Calle Paseo de la Castellana «flechita» 60. Cuando lo importo como carácter para al llegar a la flechita. No se sí podrás ayudarme. Muchas gracias por adelantado. ...

4 de marzo de 2013 · rvaquerizo

Truco SAS. Ver el contenido de un formato

Para ver los valores que toma un formato con SAS tenemos que emplear el PROC FORMAT. La sintaxis es muy sencilla: proc format library = work.formats fmtlib; select &formato. run; Tenéis que poner el nombre del formato sin punto. Sintaxis sencilla, pero difícil de recordar (por lo menos a mi me ha pasado). Saludos.

6 de febrero de 2013 · rvaquerizo

Macros SAS. Macro split para partir un conjunto de datos

Debido a problemas con un servidor hace años descubrí la macro Split. Básicamente lo que hace es partir un conjunto de datos SAS en múltiples conjuntos de datos SAS con el mismo número de observaciones, además lo hace en un solo paso data. La forma de particionar el conjunto de datos es muy simple, si alguien tiene dudas con el código que lo comente y lo analizamos mejor. La macro (mejorada) es: ...

22 de enero de 2013 · rvaquerizo

Macros SAS. Contar las palabras de una macro variable

Una macro de SAS interesante que nos permite ahorrar código. Dada una macro variable necesitamos contar el número de palabras que tiene esta macro variable. Para ello vamos a crear una función con código macro: ```sas %let texto = uno dos tres; %macro cuenta(mv); %eval(%sysfunc(length(%cmpres(&mv.),%str( ))) - %length(&mv.) + 1) %mend; %put La Macrovariable Texto tiene %cuenta(&texto.) palabras; Vemos que la macro variable texto tiene tres palabras y necesitamos contabilizarlas para automatizar un código. La propuesta que se plantea es el cálculo de la longitud de la macro sin espacios frente a la longitud de la macro variable con espacios. La diferencia más uno será el número de palabras de nuestro texto. Como aspectos interesantes tenéis el uso de %str( ) , %cmpres y como se juega con %sysfunc para evitar algún que otro problema. Esta macro tiene sus problemas, no pongáis más de dos espacios que la volvéis loca. Pero puede resultar muy útil para determinadas cosas. Saludos.

11 de diciembre de 2012 · rvaquerizo

Parámetro asociado a una Poisson con SAS

Mirad que he visto datos en mi vida. Y esos datos siguen muchas distribuciones. Y una de las distribuciones más habituales con las que me he encontrado es la distribución de poisson. Esta distribución tiene una característica muy interesante: la varianza es igual que la media. Y si la varianza no es igual a la media tenemos distribuciones de poisson sobredispersa o poisson infradispersa con propiedades muy interesantes y que se emplea mucho en el ámbito actuarial, aunque tendremos eventos con una distribución de poisson cuando estamos hablando de eventos independientes en intervalos de tiempo. No soy yo el más adecuado para escribir sobre el modelo matemático que tienen detrás estas distribuciones, pero si me gustaría mostraros como hacer mediante SAS con el PROC GENMOD algo tan básico como obtener el parámetro asociado a mi distribución de poisson y el intervalo de confianza al 95% para este parámetro. Vale que el parámetro es la media pero tengo que escribiros un código SAS importante ¿Y cómo lo calculamos? ...

15 de noviembre de 2012 · rvaquerizo

La macro iterlist para automatizar código SAS

Impresionante macro de SAS que nos puede ahorrar picar mucho mucho código SAS. La macro se llama iterlist y la he encontrado en este enlace. Es código SAS muy avanzado: %macro iterlist(code =,list =); %*** ASSIGN EACH ITEM IN THE LIST TO AN INDEXED MACRO VARIABLE &&ITEM&I ; %let i = 1; %do %while (%cmpres(%scan(&list., &i.)) ne ); %let item&i. = %cmpres(%scan(&list., &i.)); %let i = %eval((&i. + 1); %end; %*** STORE THE COUNT OF THE NUMBER OF ITEMS IN A MACRO VARIABLE: &CNTITEM; %let cntitem = %eval((&i. - 1); %*** EXPRESS CODE, REPLACING TOKENS WITH ELEMENTS OF THE LIST, IN SEQUENCE; %do i = 1 %to &cntitem.; %let codeprp = %qsysfunc(tranwrd(&code.,?,%nrstr(&&item&i..))); %unquote(&codeprp.) %end; %mend iterlist; El funcionamiento es muy complejo, destacaría el uso de `%qsysfunc`. El caso es que nos permite poner listas de código. Imaginemos que tenemos que hacer la siguiente tarea: ```sas data importes sasuser.importes; drop i j; array importe(10) ; do i=1 to 20000; do j=1 to 10; importe(j)=ranuni(8)*1000; end; grupo=ranpoi(4,5); output; end; run; proc summary data=importes nway; class grupo; output out = agr_grupo (drop=_type_ _freq_) mean(importe1)=media_importe1 mean(importe2)=media_importe2 ... mean(importe10)=media_importe10 sum(importe1)=suma_importe1 ... sum(importe10)=suma_importe10; quit; Necesitamos hacer un `proc summary` de 10 variables y de ellas vamos a calcular media y suma, tendremos que poner _sum_ y _mean_ por tantas variables como correspondan. Estamos repitiendo un código. Pues bien, esta macro nos permite repetir el código dada una lista, en este caso la lista se la pasamos como una macro: ```sas %let lista = importe1 importe2 importe3 importe4 importe5 importe6 importe7 importe8 importe9 importe10; proc summary data=importes nway; class grupo; output out = agr_grupo (drop=_type_ _freq_) %iterlist(list = &lista., code = %str( mean(?)=media_? )) %iterlist(list = &lista., code = %str( sum(?)=suma_? )); quit; Impresionante. Donde ponemos `?` la macro pone los elementos de la lista y en el parámetro code ponemos el código que se repite con `%str`. A este que escribe ahora mismo se le han caído los pantalones ante semejante genialidad. Impresionante.

17 de octubre de 2012 · rvaquerizo

Macros SAS. Pasar de texto a numérico

“Pasar de texto a número en SAS”. Una de las búsquedas que más recibe esta web. Ya hay monográficos, trucos, artículos,… al respecto. Pero faltaba una macro que espero os ayude. Es una macro muy básica pero que permite pasar textos con números en formato europeo o en formato americano. La macro: %macro texto_numero(varib_ini=, varib_fin=,europeo=0); vaux=&varib_ini.; drop vaux; %if &europeo. %then %do; vaux = compress(vaux,"."); %end; %if &europeo. %then %do; vaux = tranwrd(vaux,",","."); %end; &varib_fin. = input(vaux * 1,best12.); %mend; Breve descipción. La variable inicial (varib_ini) será la cadena de texto que deseamos pasar a número. La variable final (varib_fin) será el nombre de la variable numérica. Si deseamos conservar el nombre tenemos que jugar con rename como opción de lectura o escritura del paso data. Estoy estudiando otra macro más avanzada para realizar este trabajo. El parámetro europeo=0 es el que nos indica si el número que transformamos tiene formato europeo o no. La macro necesita una variable auxiliar (vaux) para realizar las transformaciones necesarias en el caso de ser un número en formato europeo. Una vez está el número en formato americano realizamos la transformación sobre la variable final con input, el formato que ponemos es best12.. ...

10 de octubre de 2012 · rvaquerizo