el entorno de programación estadística r aplicado a la...
TRANSCRIPT
1
El entorno de programación estadística R aplicado a la
producción de estadísticas públicas: La Encuesta de
Presupuestos Familiares
1. DESCRIPCIÓN DE LOS FICHEROS DE DATOS
Para elaborar los resultados se emplean tres tipos de ficheros
de datos,
HOGARES: conteniendo los datos de los hogares, donde cada
registro es un hogar.
GASTOS: conteniendo los gastos; cada registro es un gasto, con su correspondiente código de CINCO DÍGITOS.
MIEMBROS: los datos de los miembros de cada hogar, donde cada registro es un integrante cada hogar.
A continuación se indica el diseño de registro de cada
fichero. La descripción pormenorizada puede verse en el
documento epf_docu.docx
2
Diseño de registro del fichero de hogar
VARIABLE Nº DE CARACTERES POSICIONES
1. INFORMACIÓN GENERAL ANOENC 4 1-4 NUMERO 5 5-9 CCAA 2 10-11 NUTS1 1 12 CAPROV 1 13 TAMAMU 1 14 DENSI 1 15 CLAVE 1 16 CLATEO 1 17 FACTOR 11 (6 decimales) 18-28 2. CARACTERÍSTICAS RELATIVAS AL HOGAR NMIEMB 2 29-30 TAMAÑO 1 31 NMIEMSD 2 32-33 NMIEMHU 2 34-35 NMIEMIN 2 36-37 NMIEM1 2 38-39 NMIEM2 2 40-41 NMIEM3 2 42-43
3
VARIABLE Nº DE CARACTERES POSICIONES
NMIEM4 2 44-45 NMIEM5 2 46-47 NMIEM6 2 48-49 NMIEM7 NMIEM8 NMIEM9 NMIEM10 NMIEM11 NMIEM12 NMIEM13 NUMACTI NUMINACTI NUMOCU NUMNOCU NUMESTU NUMNOESTU NNINOSD
2 2 2 2 2 2 2 2 2 2 2 2 2 2
50-51 52-53 54-55 56-57 58-59 60-61 62-63 64-65 66-67 68-69 70-71 72-73 74-75 76-77
NHIJOSD 2 78-79 UC1 3 (1 decimal) 80-82 UC2 3 (1 decimal) 83-85 PF2TEO 2 86-87 PF2RECO 2 88-89 TIPHOGAR1 2 90-91
4
VARIABLE Nº DE CARACTERES POSICIONES
TIPHOGAR2 2 92-93 TIPHOGAR3 2 94-95 TIPHOGAR4 2 96-97 TIPHOGAR5 2 98-99 TIPHOGAR6 2 100-101 TIPHOGAR7 2 102-103 TIPHOGAR8 2 104-105 TIPHOGAR9 2 106-107 TIPHOGAR10 2 108-109 TIPHOGAR11 2 110-111 SITUOCUHOG 2 112-113 SITUACTHOG 2 114-115 3. DATOS DEL SUSTENTADOR PRINCIPAL NORDENSP 2 116-117 EDADSP 2 118-119 SEXOSP PAISNACODSP
2 2
120-121 122-123
NACIONASP 2 124-125 PAISCODSP 2 126-127 SITURESSP 2 128-129 ECIVILLEGALSP 2 130-131 NORDENCOSP UNIONSP
2 2
132-133 134-135
5
VARIABLE Nº DE CARACTERES POSICIONES
CONVIVENCIASP 2 136-137 NORDENPASP PAISPADRESP
2 2
138-139 140-141
NORDENMASP PAISMADRESP
2 2
142-143 144-145
ESTUDIOSSP 2 146-147 ESTUDREDSP 2 148-149 SITUACTSP 2 150-151 SITUREDSP OCUSP JORNADASP
2 2 2
152-153 154-155 156-157
PERCEPSP 2 158-159 IMPEXACPSP 5 160-164 IMPUEXACPSP 1 165 INTERINPSP 2 166-167 IMPUINTERPSP 1 168 TRABAJO 2 169-170 OCUPA 2 171-172 OCUPARED 2 173-174 ACTESTB 2 175-176 ACTESTBRED 2 177-178 SITPROF 2 179-180 SECTOR 2 181-182
6
VARIABLE Nº DE CARACTERES POSICIONES
TIPOCONT 2 183-184 SITSOCI 2 185-186 SITSOCIRE 2 187-188 4. CARACTERÍSTICAS DE LA VIVIENDA PRINCIPAL REGTEN 1 189 TIPOEDIF 2 190-191 ZONARES 2 192-193 TIPOCASA 2 194-195 NHABIT 2 196-197 ANNOCON 2 198-199 SUPERF 3 200-202 AGUACALI 2 203-204 FUENAGUA 2 205-206 CALEF 2 207-208 FUENCALE 2 209-210 5. OTRAS VIVIENDAS A DISPOSICIÓN DEL HOGAR DISPOSIOV 1 211 NUMOVD 1 212 REGTENV1 2 213-214 MESES V1 2 215-216 DIASV1 2 217-218 AGUACV1 2 219-220 FUENACV1 2 221-222
7
VARIABLE Nº DE CARACTERES POSICIONES
CALEFV1 2 223-224 FUENCAV1 2 225-226 REGTENV2 2 227-228 MESES V2 2 229-230 DIASV2 2 231-232 AGUACV2 2 233-234 FUENACV2 2 235-236 CALEFV2 2 237-238 FUENCAV2 2 239-240 REGTENV3 2 241-242 MESES V3 2 243-244 DIASV3 2 245-246 AGUACV3 2 247-248 FUENACV3 2 249-250 CALEFV3 2 251-252 FUENCAV3 2 253-254 REGTENV4 2 255-256 MESES V4 2 257-258 DIASV4 2 259-260 AGUACV4 2 261-262 FUENACV4 2 263-264 CALEFV4 2 265-266 FUENCAV4 2 267-268
8
VARIABLE Nº DE CARACTERES POSICIONES
REGTENV5 2 269-270 MESES V5 2 271-272 DIASV5 2 273-274 AGUACV5 2 275-276 FUENACV5 2 277-278 CALEFV5 2 279-280 FUENCAV6 2 281-282 REGTENV6 2 283-284 MESES V6 2 285-286 DIASV6 2 287-288 AGUACV6 2 289-290 FUENACV6 2 291-292 CALEFV6 2 293-294 FUENCAV6 2 295-296 REGTENV7 2 297-298 MESES V7 2 299-300 DIASV7 2 301-302 AGUACV7 2 303-304 FUENACV7 2 305-306 CALEFV7 2 307-308 FUENCAV7 2 309-310 REGTENV8 2 311-312 MESES V8 2 313-314
9
VARIABLE Nº DE CARACTERES POSICIONES
DIASV8 2 315-316 AGUACV8 2 317-318 FUENACV8 2 319-320 CALEFV8 2 321-322 FUENCAV8 2 323-324 REGTENV9 2 325-326 MESES V9 2 327-328 DIASV9 2 329-330 AGUACV9 2 331-332 FUENACV9 2 333-334 CALEFV9 2 335-336 FUENCAV9 2 337-338 6. GASTOS DE CONSUMO DEL HOGAR GASTOT 16 (2 decimales) 339-354 IMPUTGAS 5 (2 decimales) 355-359 GASTMON 16 (2 decimales) 360-375 GASTNOM1 13 (2 decimales) 376-388 GASTNOM2 13 (2 decimales) 389-401 GASTNOM3 13 (2 decimales) 402-414 GASTNOM4 13 (2 decimales) 415-427 7. INGRESOS REGULARES MENSUALES DEL HOGAR CAPROP 2 428-429 CAJENA 2 430-431
10
VARIABLE Nº DE CARACTERES POSICIONES
PENSIO 2 432-433 DESEM 2 434-435 OTRSUB 2 436-437 RENTAS 2 438-439 OTROIN 2 440-441 FUENPRIN 2 442-443 FUENPRINRED
2 444-445
IMPEXAC 5 446-450 IMPUEXAC 1 451 INTERIN 2 452-453 IMPUINTER 1 454 NUMPERI 2 455-456 8. NÚMERO DE COMIDAS Y CENAS EFECTUADAS DURANTE LA BISEMANA MUESTRAL COMIMH 3 457-459 COMISD 3 460-462 COMIHU 3 463-465 COMIINV 3 466-468 COMITOT 3 469-471
11
Diseño de registro del fichero de gastos.
VARIABLE Nº DE CARACTERES POSICIONES
ANOENC 4 1-4 NUMERO 5 5-9 CODIGO 5 10-14 GASTO 15(2 decimales) 15-29 PORCEN 5 (2 decimales) 30-34 CANTIDAD 12(2 decimales) 35-46 GASTMON 15(2 decimales) 47-61 GASTNOM1 13(2 decimales) 62-74 GASTNOM2 13(2 decimales) 75-87 GASTNOM3 13(2 decimales) 88-100 GASTNOM4 13(2 decimales) 101-113 GASTNOM5 13(2 decimales) 114-126 FACTOR 11 (6 decimales) 127-137
12
Diseño de registro del fichero de miembros del hogar.
VARIABLE Nº DE CARACTERES
POSICIONES
ANOENC 4 1-4 NUMERO 5 5-9 NORDEN 2 10-11 CATEGMH 2 12-13 SUSPRIN 1 14 RELASP 2 15-16 EDAD 2 17-18 SEXO PAISNACIM
2 2
19-20 21-22
NACIONA 2 23-24 PAISNACION 2 25-26 SITURES 2 27-28 ECIVILLEGAL 2 29-30 NORDENCO UNION CONVIVENCIA
2 2 2
31-32 33-34 35-36
NORDENPA PAISPADRE
2 2
37-38 39-40
13
VARIABLE Nº DE CARACTERES
POSICIONES
NORDENMA PAISMADRE
2 2
41-42 43-44
ESTUDIOS 2 45-46 ESTUDRED 2 47-48 SITUACT 2 49-50 SITURED OCU JORNADA
2 2 2
51-52 53-54 55-56
PERCEP 2 57-58 IMPEXACP 5 59-63 IMPUEXACP 1 64 INTERINP 2 65-66 IMPUINTERP 1 67 NINODEP 2 68-69 HIJODEP 2 70-71 ADULTO 2 72-73 FACTOR 11 (6 decimales) 74-84
14
2. LECTURA DE FICHEROS CON LA ESTRUCTURA DESCRITA
Para leer este tipo de ficheros, en los cuales no hay ningún
tipo de separador entre las variables, se puede emplear la
instrucción de R, read.fwf(),
read.fwf(file, widths, header = FALSE, sep = "\t",
skip = 0, row.names, col.names, n = -1,
buffersize = 2000, ...)
donde,
file: nombre del fichero a leer.
widths: vector de números enteros con las anchuras de las
variables. Un entero negativo indica salto de columna. P.E. -5
indica que hay que saltar 5 columnas.
header: TRUE o FALSE según haya o no nombres de variables en la
primera fila. Por defecto FALSE.
15
EJEMPLO. Lectura del fichero de hogares. Lo hacemos por bloques
para un mayor control de posibles errores. Se podría hacer
globalmente. Los nombres de las variables son definidos a
posteriori pero se podría hacer directamente con col.names.
nf='C:\\r_epf\\FUSUHOG.SFPE.A2011.CCAA01.TXT'
formato=c(4,5,2,1,1,1,1,1,1,11)
datos_hogar=read.fwf(nf,widths=formato)
#le damos nombres; se puede hacer dentro de read.fwf()
#1. InformaciOn general
names(datos_hogar)[1]='ANOENC'
names(datos_hogar)[2]='NUMERO'
names(datos_hogar)[3]='CCAA'
names(datos_hogar)[4]='NUTS1'
names(datos_hogar)[5]='CAPROV'
names(datos_hogar)[6]='TAMAMU'
names(datos_hogar)[7]='DENSI'
names(datos_hogar)[8]='CLAVE'
names(datos_hogar)[9]='CLATEO'
names(datos_hogar)[10]='FACTOR'
#La columna 10 es 11.6; la dividimos por 10^6
datos_hogar$FACTOR=datos_hogar$FACTOR/10^6
16
#2. CaracterIsticas relativas al hogar
salto=sum(formato)
formato_aux=c(2,1,rep(2,24),3,3,rep(2,15))
formato=c(-salto,formato_aux)
datos=read.fwf(nf,widths=formato)
names(datos)[1]='NMIEMB'
names(datos)[2]='TAMAÑO'
names(datos)[3]='NMIEMSD'
names(datos)[4]='NMIEMHU'
names(datos)[5]='NMIEMIN'
names(datos)[6]='NMIEM1'
names(datos)[7]='NMIEM2'
names(datos)[8]='NMIEM3'
names(datos)[9]='NMIEM4'
names(datos)[10]='NMIEM5'
names(datos)[11]='NMIEM6'
names(datos)[12]='NMIEM7'
names(datos)[13]='NMIEM8'
names(datos)[14]='NMIEM9'
names(datos)[15]='NMIEM10'
names(datos)[16]='NMIEM11'
names(datos)[17]='NMIEM12'
names(datos)[18]='NMIEM13'
names(datos)[19]='NUMACTI'
names(datos)[20]='NUMINACTI'
names(datos)[21]='NUMOCU'
names(datos)[22]='NUMNOCU'
17
names(datos)[23]='NUMESTU'
names(datos)[24]='NUMNOESTU'
names(datos)[25]='NNINOSD'
names(datos)[26]='NHIJOSD'
names(datos)[27]='UC1'
names(datos)[28]='UC2'
names(datos)[29]='PF2TEO'
names(datos)[30]='PF2RECO'
names(datos)[31]='TIPHOGAR1'
names(datos)[32]='TIPHOGAR2'
names(datos)[33]='TIPHOGAR3'
names(datos)[34]='TIPHOGAR4'
names(datos)[35]='TIPHOGAR5'
names(datos)[36]='TIPHOGAR6'
names(datos)[37]='TIPHOGAR7'
names(datos)[38]='TIPHOGAR8'
names(datos)[39]='TIPHOGAR9'
names(datos)[40]='TIPHOGAR10'
names(datos)[41]='TIPHOGAR11'
names(datos)[42]='SITUOCUHOG'
names(datos)[43]='SITUACTHOG'
datos$UC1=datos$UC1/10
datos$UC2=datos$UC2/10
datos_hogar=cbind(datos_hogar,datos)
Etc. Etc.
18
Es importante observar que esta instrucción, por defecto lee las
cantidades numéricas como números, y las alfanuméricas como cadenas
de caracteres. Por ejemplo 12a34 lo leerá como cadena, 12534 como
cantidad numérica igual a 12534, y 02344 como cantidad numérica
igual a 2344.
Esto significa que si queremos que 01234 lo lea como cadena de
caracteres, será necesario forzar a un tipo determinado con el
cualificador colClasses. Por ejemplo, en el fichero de gastos, la
variable CODIGO es de este tipo. Para leerla como alfanumérica
empleamos el siguiente código,
nf='C:\\r_epf\\FUSUGAST.SFPE.A2011.CCAA01.TXT'
#La tercera variable, CODIGO, ha de ser leIda como carActer
tipo=rep(NA,13);tipo[3]='character'
formato=c(4,5,5,15,5,12,15,rep(13,5),11)
datos_gastos=read.fwf(nf,widths=formato,colClasses = tipo)
#le damos nombres; se puede hacer dentro de read.fwf()
names(datos_gastos)[1]='ANOENC'
names(datos_gastos)[2]='NUMERO'
names(datos_gastos)[3]='CODIGO'
names(datos_gastos)[4]='GASTO'
19
names(datos_gastos)[5]='PORCEN'
names(datos_gastos)[6]='CANTIDAD'
names(datos_gastos)[7]='GASTMON'
names(datos_gastos)[8]='GASTONOM1'
names(datos_gastos)[9]='GASTONOM2'
names(datos_gastos)[10]='GASTONOM3'
names(datos_gastos)[11]='GASTONOM4'
names(datos_gastos)[12]='GASTONOM5'
names(datos_gastos)[13]='FACTOR'
for (i in 4:12) datos_gastos[i]=datos_gastos[i]/100
datos_gastos[13]=datos_gastos[13]/10^6
Es decir, el cualificador colClasses, que por defecto es un
vectos de NA, se puede definir como un vector de tipos para cada
variable. Los tipos pueden ser character, numeric, integer, etc.
NÓTESE como las variables con decimales hay que procesarlas después
de la lectura, dividiendo por la potencia de 10 adecuada.
20
Otra forma, más controlada, de leer este tipo de ficheros, es
emplear la función read.fortran(), que es similar a la anterior,
pero emplea los formatos de lectura del lenguaje Fortran. Su forma
básica es,
read.fortran(file, format, ...)
donde format es un vector conteniendo los formatos. Los más
empleados son,
In : entero de n posiciones.
An : alfanumérico de n posiciones.
Xn : salto de n posiciones.
Fn.m : número real con nposiciones, y m decimales.
Por ejemplo, para leer el fichero de gastos, el código sería,
nf='C:\\r_epf\\FUSUGAST.SFPE.A2011.CCAA01.TXT'
#lectura con formato; se puede saltar al principio; ver ayuda
formato=c('A4','I5','A5','F15.2','F5.2','F12.2','F15.2',rep('F13.2'
,5),'F11.6')
datos_gastos=read.fortran(nf,formato)
#le damos nombres; se puede hacer dentro de read.fortran()
names(datos_gastos)[1]='ANOENC'
21
names(datos_gastos)[2]='NUMERO'
names(datos_gastos)[3]='CODIGO'
names(datos_gastos)[4]='GASTO'
names(datos_gastos)[5]='PORCEN'
names(datos_gastos)[6]='CANTIDAD'
names(datos_gastos)[7]='GASTMON'
names(datos_gastos)[8]='GASTONOM1'
names(datos_gastos)[9]='GASTONOM2'
names(datos_gastos)[10]='GASTONOM3'
names(datos_gastos)[11]='GASTONOM4'
names(datos_gastos)[12]='GASTONOM5'
names(datos_gastos)[13]='FACTOR'
#Fin de lectura del fichero de gastos
22
3. LECTURA DE FICHEROS CON DATOS DELIMITADOS
Si las variables estuvieran separadas por algún tipo de
separador, podríamos emplear la instrucción clásica de lectura de
datos que es read.table(). Por ejemplo, si los datos de gastos
tienen la siguiente estructura,
"ANOENC";"NUMERO";"CODIGO";"GASTO";"PORCEN";"CANTIDAD";"GASTMON";"G
ASTNOM1";"GASTNOM2";"GASTNOM3";"GASTNOM4";"GASTNOM5";"FACTOR"
"2011";"00012";"01111";"7789.3";"0.6";".";"7789.3";".";".";".";".";
".";"1618.35266"
"2011";"00012";"01112";"1056956.39";"1.77";"343853.33";"1056956.39"
;".";".";".";".";".";"1618.35266"
"2011";"00012";"01113";"266228.06";"3.8";"35534.36";"266228.06";"."
;".";".";".";".";"1618.35266"
"2011";"00012";"01114";"84063.88";"0.03";"46411.99";"84063.88";".";
".";".";".";".";"1618.35266"
"2011";"00012";"01115";"106562.52";"6.23";".";"106562.52";".";".";"
.";".";".";"1618.35266"
"2011";"00012";"01116";"348.08";"0.6";".";"348.08";".";".";".";".";
".";"1618.35266"
23
los podemos leer con el siguiente código,
#Nombre del fichero de datos
nf="C:\\r_epf\\GASTOAND_2011.txt"
#R por defecto asigna los tipos de las variables por similitud.
#Nosotros queremos que la tercera variable, que son los cOdigos
#de gastos, la lea como carActer. Entonces tenemos que emplear
#la especificación colClasses.
formato=rep(NA,13)
formato[3]='character'
#NOTA: la especificaciOn na.strings=c(".") hace que todos los datos del
#tipo "." los lea como NA. Esto lo hacemos porque en el fichero de gastos
#hay variables que tienen valores "." en lugar de "0.0"
#Y ya leemos
datos_gastos=read.table(nf,header=T,sep=";",quote="\"",colClasses=formato,
na.strings=c("."),dec=".")
#Fin de lectura del fichero de gastos.
24
OBSERVACIONES: En la instrucción de lectura,
datos_gastos=read.table(nf,header=T,sep=";",quote="\"",colClasses=formato,
na.strings=c("."),dec=".")
tenemos,
header=T: Lo ponemos porque la primera línea contiene los nombres
de las variables.
sep=";" : El carácter separador de variables.
dec="." : El carácter empleado como separador de decimales.
na.strings=c(".") : Nótese que hay datos iguales a "."; entonces
read.table() los lee, por defecto, como cadena de caracteres igual
a ".", lo que origina problemas a la hora de realizar operaciones.
Con na.strings=c(".") forzamos a que dichos datos sean leídos
como NA, es decir, el tipo 'not available'. Que no produce
problemas pues son interpretados como cero a la hora de sumar,
operar, etc.
25
4. CODIFICACIÓN Y RECODIFICACIÓN DE VARIABLES
A veces es necesario codificar una variable, agrupando conjuntos de
valores y codificando los mismos. Por ejemplo, la variable EDADSP,
perteneciente al fichero de hogares, y que representa la edad del
sustentador principal, viene en años, y hay que agrupar en los
grupos de 16 a 29, de 30 a 44, de 45a 64, y mayores o iguales de
65. Con la instrucción,
datos_hogar$EDADC=cut(datos_hogar$EDADSP,c(16,29,44,64,150),labels=F)
creamos una nueva variable, EDADC, con códigos para cada grupo. Al
especificar labels=F, se crean por defecto los códigos 1, 2, 3 y 4.
En otras situaciones, es necesario recodificar, es decir,
modificar los códigos de una variable ya codificada, usualmente por
actualizaciones en la definición de los códigos.
26
Por ejemplo, la variable ESTUDIOSP, en el fichero de hogares,
está codificada de una forma obsoleta, y hay que actualizar dichos
códigos.
Lo hacemos creando una nueva variable, NEST, con el siguiente
código que es casi autoexplicativo. Recuérdese que | es el Ó
lógico,
#Recodificamos la variable estudios del sustentador principal,
ESTUDIOSSP,
#para adaptarlo a los nuevos cOdigos, y creamos la variable NEST
datos_hogar$NEST=datos_hogar$ESTUDIOSSP
#RecodificaciOn
datos_hogar$NEST[datos_hogar$NEST==1 | datos_hogar$NEST==2]=1
datos_hogar$NEST[datos_hogar$NEST==3]=2
datos_hogar$NEST[datos_hogar$NEST==4 | datos_hogar$NEST==5]=3
datos_hogar$NEST[datos_hogar$NEST==6]=4
datos_hogar$NEST[datos_hogar$NEST==7 | datos_hogar$NEST==8]=5
datos_hogar$NEST[datos_hogar$NEST==9 | datos_hogar$NEST==10 |
datos_hogar$NEST==11]=6
datos_hogar$NEST[datos_hogar$NEST==-9]=7
27
#otra forma que emplea el operador lOgico de inclusiOn
#datos_hogar$NEST[datos_hogar$NEST %in% c(1,2)] =1
#datos_hogar$NEST[datos_hogar$NEST %in% c(3)] =2
#datos_hogar$NEST[datos_hogar$NEST %in% c(4,5)] =3
#datos_hogar$NEST[datos_hogar$NEST %in% c(6)] =4
#datos_hogar$NEST[datos_hogar$NEST %in% c(7,8)] =5
#datos_hogar$NEST[datos_hogar$NEST %in% c(9,10,11)]=6
#datos_hogar$NEST[datos_hogar$NEST %in% c(-9)] =7
28
5. MANIPULACIÓN DE TABLAS
Entendemos por tablas, tanto matrices como dataframes.
Básicamente son arreglos bidimensionales.
Si TABLA1 y TABLA2 son estructuras de este tipo de este tipo, y
suponemos que todas sus componentes son numéricas,
colSums(TABLA1) : es un vector con la suma de las columnas de
TABLA1.
rowSums(TABLA1) : es un vector con la suma de las filas de
TABLA1.
apply(TABLA1,1,fun) : aplica a cada fila de TABLA1 la función fun.
apply(TABLA1,2,fun) : aplica a cada columna de TABLA1 la función
fun.
rbind(TABLA1,TABLA2): fusiona TABLA1 y TABLA2 por filas. Supuesta
compatibilidad.
cbind(TABLA1,TABLA2): fusiona TABLA1 y TABLA2 por columnas.
Supuesta compatibilidad
29
EJEMPLO:
> d=data.frame(x=1:5,y=(1:5)^2)
> apply(d,1,sum) #suma los elementos de cada fila
> apply(d,2,sum) #suma los elementos de cada columna
> apply(d,2,sample) #permuta los elementos de cada columna
> apply(d,2,function(x)sample(x,3)) #muestra de tamaño 3, de cada columna
NÓTESE como es posible aplicar otras funciones más complicadas,
definiéndolas en el momento.
30
6. CREACIÓN DE VECTORES Y TABLAS DE RESULTADOS
Supongamos que var1 es una variable conteniendo los valores de
una determinada característica; y var2 y var3 son variables, de la
misma longitud que var1, que contienen categorías, por ejemplo sexo
codificado como 1 y 2, o edad codificada como 1, 2, 3 y 4.
Entonces,
tapply(var1,var2,FUN)
aplica la función FUN a cada grupo de valores de var1 definido por
las categorías de var2. Si FUN es una función de resumen, como sum,
length, mean, etc., entonces obviamente genera un vector de tantas
componentes como categorías hay.
EJEMPLO:
> var1=c(20,34,34,23,12,45,67,34)
> var2=c(1,2,1,2,2,1,1,1)
> tapply(var1,var2,sum)
31
Y para dos variables,
tapply(var1,list(var2,var3),FUN)
aplica la función FUN a cada grupo de valores de var1 definido por
los cruces de las categorías de var2 con las de var3.
Si FUN es una función de resumen, como sum, length, mean, etc.,
entonces obviamente genera una tabla de tantas filas y columnas
como categorías respectivas de var2 y var3 hay.
EJEMPLO:
> var1=rexp(1000,0.1) #1000 valores Exp(10)
> var2=sample(c("1:<20","2:21-40","3:>40"),1000,rep=T) #edades categorizadas
> var3=sample(c("H","M"),1000,rep=T) #sexo
> tapply(var1,list(var2,var3),mean) #media
> tapply(var1,list(var2,var3),length) #número de elementos
> tapply(var1,list(var2,var3),mean)-> tabla
> apply(tabla,2,function(x)x/rowSums(tabla)*100) #porcentajes por filas
32
7. ALGUNAS FUNCIONES INTERESANTES
tail(v,n) : cola de n elementos del vector v. Si n=1, el último.
Es aplicable también a tablas.
t(TABLA) : traspone la tabla TABLA.
diag(v) : matriz diagonal con diagonal el vector v.
sweep(TABLA,2,v,"/") : divide cada columna de tabla por los respectivos
componentes de v. Y 1 para filas.
Lo anterior es equivalente a TABLA%*%diag(1/v)
33
8. ESCRITURA DE TABLAS
Formato de texto básico:
Para escribir la tabla TABLA, con nombre tabla.txt empleamos,
write.table(TABLA,'tabla.txt',sep='\t',row.names=F)
Por defecto escribe en el directorio o carpeta de trabajo.
Admite fijar una trayectoria.
Formato Excel:
Para escribir la tabla TABLA, con nombre tabla.xlsx empleamos,
write.xlsx(TABLA,'tabla.xlsx',row.names='F')
Por defecto escribe en el directorio o carpeta de trabajo.
Admite fijar una trayectoria.
34
NOTAS:
(a) Requiere cargar la librería xlsx.
(b) Posibles problemas con Java y versión R de 64 bits si Java no
está convenientemente actualizado. Hay que tener instalada la
versión de de 64 bits.
(c) Librería con muchas posibilidades.
(d) Hay otras librerías que permiten el intecambio con Excel. Por
ejemplo XLConnect y xlsReadWrite.