SAS, SPSS y R: Ejemplos de componentes para tratamiento de datos. Equivalencias entre herramientas

 

Existen en el Mercado numerosas herramientas para tratamiento de datos. En este post, nos vamos a centrar en algunas de las más utilizadas: SAS, SPSS y R. Sin entrar a valorar la mejor o peor adecuación de cada una de ellas al tipo de proyecto en el que trabajemos, sus ventajas o sus inconvenientes,  lo que es evidente es que son tres herramientas muy extendidas.  Existen comparativas interesantes: sasybi.blogspot.com.es/2015/05/data-science-tools-sas-vs-r.html

 

Equivalencias entre SAS, SPSS y R

 

En este post, mostraremos ejemplos de manipulación de datos en las tres herramientas, con hasta 19 casos comunes de manipulación de datos (lecturas, ordenaciones, filtrados, uniones, cruces, exportaciones, etc..), con objeto de tener el mismo código traducido a las tres herramientas. Estos ejemplos pretenden ser de ayuda para que usuarios de una de las tres herramientas puedan empezar a conocer las otras dos o también como ayuda en un proyecto de migración de procesos de una herramienta a otra.

 

Ejemplo 1. Obtener datos de una BBDD vía ODBC:

 

 

SAS:

proc sql;

connect to odbc(dsn=dm_demo uid=user pwd=****);

create table tabla1 as

select *

from connection to odbc(

select *

from tabla_bbdd

);

quit;

 

SPSS:

*tabla1.sps.

GET DATA /TYPE=ODBC /CONNECT=

'DSN=MS Access Database;DBQ=/examples/data/dm_demo.mdb;'+

'DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;'

/SQL = 'SELECT * FROM tabla_bbdd'.

EXECUTE.

 

R:

library(RODBC)

conndb <- odbcConnect("dsn1", uid = "user", pwd = "****")

tabla1 <- sqlQuery(conndb,"SELECT * FROM tabla_bbdd").

 

Ejemplo 2. Lectura fichero Excel (.xls):

 

 

SAS:

 

proc import datafile='C:\temp\datos_excel.xls'

dbms=excel2000 replace out=tabla_excel;

sheet="Hoja1";

range="A2:I15";

getnames=yes;

run;

 

 

SPSS:

 

GET DATA

/TYPE=XLS

/FILE='C:\temp\datos_excel.xls'

/SHEET=NAME 'Hoja1'

/CELLRANGE=RANGE 'A2:I15'

/READNAMES=on .

 

R:

tabla_excel <- read.table("C:/temp/datos_excel.csv", header=TRUE, sep=";", na.strings="NA", dec=".", strip.white=TRUE)

 

 

 

Ejemplo 3. Lectura fichero plano (txt):

 

 

SAS:

 

data tabla_entrada;                                                                                                                           

      infile 'C:\temp\entrada.txt' dlm = ';'                                                                                                

      input  cod_cliente:8. des_cliente:$20.;                                                                                                            

run; 

 

SPSS:

 

GET DATA /TYPE = TXT

/FILE = 'C:\temp\entrada.txt'

/DELIMITERS = ";"

/QUALIFIER = '"'

/ARRANGEMENT = DELIMITED

/FIRSTCASE = 2

/VARIABLES = cod_cliente F1 des_cliente A20

 

 

R:

 

 

tabla_entrada <- read.table("C:/temp/entrada.txt", header=FALSE, sep=";", na.strings="NA",

  dec=".", strip.white=TRUE)

nombres<-c("cod_cliente","des_cliente")  /* nombres de los campos */

names(tabla_entrada)<-nombres

 

 

Ejemplo 4. Crear tabla:

 

 

SAS:

 

 

data tabla1;

input cod_cliente des_cliente $  arpu  ;

datalines;

1 JVG 25

2 PAF 40

3 AAG 35

;

run;

 

 

SPSS:

 

 

DATA LIST LIST / cod_cliente des_cliente (A10) arpu.

BEGIN DATA.

1 JVG 25

2 PAF 40

3 AAG 35

END DATA.

 

SAVE OUTFILE = "tabla1.sav".

LIST.

 

 

R:

 

 

cod_cliente <- c(1,2,3)

des_cliente <- c("JVG","PAF","AAG")

arpu <- c(25,40,35)

tabla1 <- data.frame(cod_cliente, des_cliente, arpu)

 

 

Ejemplo 5. Cruce de tablas (merge):

 

 

SAS:

 

proc sort data=tabla1;

by cod_cliente;

run;

 

proc sort data=tabla2;

by cod_cliente;

run;

 

data tabla_merge;

merge tabla1 tabla2;

by cod_cliente;

run;

 

 

SPSS:

 

 

GET FILE='C:\temp\tabla1.sav'.

SORT CASES BY cod_cliente.

DATASET NAME tabla1

GET FILE='C:\temp\tabla2.sav'.

SORT CASES BY cod_cliente.

DATASET NAME tabla2.

MATCH FILES /FILE=*

/FILE='tabla1'

/FILE='tabla2'

/BY cod_cliente.

EXECUTE.

 

R:

tabla_merge <- merge(tabla1, tabla2, all=FALSE, by="cod_cliente")

 

 

Ejemplo 6. Unir dos tablas (append):

 

 

SAS:

 

data tabla_union;

set tabla1 tabla2;

run;

  

SPSS:

 

ADD FILES

/FILE = 'C:\temp\tabla1.sav'

/FILE = 'C:\temp\tabla2.sav'

EXECUTE.

SAVE OUTFILE = 'C:\temp\tabla_union.sav'.

  

R:

 

 

tabla_union  <- rbind(tabla1,tabla2)

 

 

Ejemplo 7. Obtener agregados:

 

SAS:

 

 

proc summary data=tabla1 noprint nway;

   class cod_cliente ;

   output out=tabla_ag(drop=_type_ _freq_)

   sum(arpu) = suma_arpu mean(arpu) = media_arpu ;

run;

 

 

SPSS:

 

 

aggregate outfile 'c:\temp\tabla_ag.sav'

 /break cod_cliente

 /suma­_arpu = sum(arpu).

 /media_arpu = mean(arpu)

get file 'c:\temp\tabla1.sav'.

list.

 

 

R:

tabla_ag <- aggregate(tabla1["arpu"], by=list(cod_cliente=tabla1$cod_cliente), FUN=sum)

 

 

Ejemplo 8. Eliminar duplicados:

 

SAS:

 

proc sort data=tabla1 nodupkeys;

by cod_cliente;

run;

 

 

SPSS:

 

GET FILE='C:\temp\tabla1.sav'.

SORT CASES BY cod_cliente .

MATCH FILES /FILE = *

/BY cod_cliente /LAST = ultimo .

FILTER BY ultimo .

EXECUTE.

 

R:

 

tabla1_uniq <- unique(tabla1)

 

 

Ejemplo 9. Recodificación variables:

 

SAS:

 

 

data tabla2;

set tabla1;

if arpu >= 0 and arpu <= 10 then do;

       grupo_arpu = 1;

end;

else do;

       if arpu > 10 and arpu <= 20 then do;

             grupo_arpu = 2;

       end;

       else do;

             grupo_arpu = 3;

       end;

end;

run;

 

SPSS:

 

 

GET FILE='C:\temp\tabla1.sav'.

RECODE arpu (lo thru 10=1) (11 thru 20=2) (21 thru hi=3) into grupo_arpu.

COMPUTE.

SAVE OUTFILE = 'C:\temp\tabla2.sav'.

 

R:

 

 

tabla1$grupo_arpu[tabla1$arpu>=0 & tabla1$arpu <= 10 ] <- 1

tabla1$grupo_arpu[tabla1$arpu>10 & tabla1$arpu <= 20 ] <- 2

tabla1$grupo_arpu[tabla1$arpu>20 ] <- 3

 

 

Ejemplo 10. Renombrar variables:

 

SAS:

 

data tabla1(rename=(cod_cliente=id_cliente));

set tabla1;

run;

 

 

SPSS:

 

GET FILE='C:\temp\tabla1.sav'.

RENAME VARIABLES (cod_cliente = id_cliente).

EXECUTE.

SAVE OUTFILE = 'C:\temp\tabla2.sav'.

 

R:

colnames(tabla1)[colnames(tabla1)=="cod_cliente"] <- "id_cliente"

  

Ejemplo 11. Funciones aritméticas:

 

SAS:

 

data tabla_num;

input var1-var4;

resto= mod(var4,3);

media = mean(of var1-var4);

media_ent = int(media);

cards;

1 . 3 4

5 6 7 8

9 . . 12

;

run;

 

 

SPSS:

 

DATA LIST LIST (",") /var1 var2 var3 var4.

BEGIN DATA

1, , 3, 4

5, 6, 7, 8

9, , , 12

END DATA.

COMPUTE resto = MOD(var4, 3).

COMPUTE media = MEAN.3(var1, var2, var3, var4).

COMPUTE media_ent = TRUNC(MEAN(var1 TO var4)).

EXECUTE.

SAVE OUTFILE = 'C:\temp\tabla_num.sav'.

 

R:

  

tabla1$media <- (tabla1$var1 + tabla1$var2 + tabla1$var3 + tabla1$var4)/4

tabla1$resto <- tabla1$var4 %% 3

tabla1$media_ent <- trunc(tabla1$media)

 

 

Ejemplo 12. Funciones tratamiento texto:

 

SAS:

 

data tabla_car;

length cadena $50.

set tabla_num;

cadena = cat(var1,"-",var2,"-",var3);

run;

 

SPSS:

 

GET FILE='C:\temp\tabla_num.sav'.

STRING cadena (A50).

COMPUTE cadena =

CONCAT((STRING(var1)), "-",(STRING(var2)), "-",(STRING(var3))).

EXECUTE.

SAVE OUTFILE = 'C:\temp\tabla_car.sav'.

 

R:

 

tabla1$cadena = paste(tabla1$var1, tabla1$var2, tabla1$var3, sep='-')

 

Ejemplo 13. Tratamiento de fechas:

 

SAS:

 

data fechas;

infile cards ;

input fecha_inicio : MMDDYY10. fecha_fin : MMDDYY10.;

dias=fecha_fin-fecha_inicio;

cards;

3/01/2014 4/06/2014

3/02/2014 4/06/2014

3/06/2014 4/06/2014

;

run;

 

SPSS:

 

DATA LIST LIST

/fecha_inicio (ADATE12) fecha_fin (ADATE12)

BEGIN DATA

3/01/2014 4/06/2014

3/02/2014 4/06/2014

3/06/2014 4/06/2014

END DATA.

COMPUTE dias = CTIME.DAYS(fecha_fin – fecha_inicio).

EXECUTE.

SAVE OUTFILE = 'C:\temp\fechas.sav'.

 

R:

 

fecha_ini <- c(as.Date('03/01/2014',format='%d/%m/%Y'),as.Date('03/02/2014',format='%d/%m/%Y'),as.Date('03/06/2014',format='%d/%m/%Y'))

fecha_fin <- c(as.Date('04/06/2014',format='%d/%m/%Y'),as.Date('04/06/2014',format='%d/%m/%Y'),as.Date('04/06/2014',format='%d/%m/%Y'))

tabla_fecha <- data.frame(fecha_ini, fecha_fin)

tabla_fecha$dias = tabla_fecha$fecha_fin - tabla_fecha$fecha_ini

 

 

 

Ejemplo 14. Filtrado de datos (where):

 

SAS:

 

data tabla_filtro;

set tabla1;

where arpu > 10;

run;

 

SPSS:

 

GET FILE='C:\temp\tabla1.sav'.

SELECT IF(arpu > 10).

SAVE OUTFILE='C:\temp\tabla_filtro.sav'.

EXECUTE.

 

R:

 

tabla_filtro <-subset(tabla1, arpu > 10)

 

 

Ejemplo 15. Selección de variables (keep):

 

SAS:

 

data tabla_keep (keep = cod_cliente arpu);

set tabla1;

run;

 

SPSS:

 

GET FILE='C:\temp\tabla1.sav'.

SAVE OUTFILE='c:\temp\tabla_filtro.sav' /KEEP=cod_cliente,arpu.

EXECUTE.

 

R:

 

tabla_keep <- tabla1[c("cod_cliente", “arpu”)]

 

Ejemplo 16. Ordenar tabla (sort):

 

SAS:

 

proc sort data=tabla1 out=tabla_ord;

by cod_cliente;

run;

     

 

SPSS:

 

GET FILE='C:\temp\tabla1.sav'.

SORT CASES BY ID_CLIENTE.

SAVE OUTFILE='c:\temp\tabla_ord.sav'.

EXECUTE.

 

R:

 

tabla_ord  <-  tabla1[order(tabla1$cod_cliente, ]

 

Ejemplo 17.  Estructuras condicionales (if):

 

SAS:

 

data tabla1;

set tabla1;

if arpu <= 10 then arpu_g = 1; else arpu_g = 2;

run;         

 

SPSS:

 

 

GET FILE=("c:\temp\tabla1.sav")

COMPUTE arpu_g=2.

IF (arpu <= 10 ) arpu_g=1.

SAVE OUTFILE='c:\temp\tabla1.sav'.

EXECUTE.

 

R:

 

 

tabla_sal$arpu_g <- ifelse( arpu >= 10, 1,2)

 

Ejemplo 18.  Exportar a fichero plano (txt):

 

 

SAS:

 

 

data _null_;                                                                                                                           

set  tabla1;                                                                                                                         

file 'C:\temp\salida.txt' ;

informat cod_cliente 8. arpu 8.;                                                                                                   

put cod_cliente arpu;                                                                                                                  

run; 

 

SPSS:

 

 

GET FILE=("c:\temp\tabla1.sav")

SAVE TRANSLATE

OUTFILE='C:\temp\salida.txt'

/TYPE=TAB

/MAP

/REPLACE

/FIELDNAMES

/CELLS=VALUES.

     

R:

 

write.table(tabla1, file = "C:/temp/salida.txt")

 

Ejemplo 19.  Exportar a csv:

 

SAS:

 

 

proc export data=tabla1

outfile="C:\temp\salida.csv"

dbms= csv replaces;

putnames=yes;

run;

      

SPSS:

 

 

GET FILE=("c:\temp\tabla1.sav")

SAVE TRANSLATE

OUTFILE='C:\temp\salida.csv'

/TYPE=CSV

/MAP

/REPLACE

/FIELDNAMES

/CELLS=VALUES.

 

R:

write.csv(tabla1, file=" C:/temp/salida.csv";)

 

Información sobre cursos de SAS:

 

http://www.datademy.es

https://www.youtube.com/@datademyformacion6610