Parte I: Construcción de la clave

1 Se lee el microdato Censo 2017 csv con la función import de la librería rio.

library("rio")
x <- import("Microdato_Censo2017-Hogares.csv")

Hacemos un subset para trabajar mas rápido:

# x <- x[c(1:10000),]

El código se construye uniendo los siguientes elementos de la base de datos

COMUNA : Se mantiene igual. DC : Siempre debe tener dos digitos anteponiendo un cero si tiene uno. AREA : Se mantiene igual. ZC_LOC : Siempre debe tener tres digitos anteponiendo un cero si tiene dos y dos si tiene uno.

2 Analicemos la estructura del código de Comuna:

head(unique(x$COMUNA),140)
##   [1] 15202 15201 15102 15101 14204 14203 14202 14201 14108 14107 14106 14105
##  [13] 14104 14103 14102 14101 13605 13604 13603 13602 13601 13505 13504 13503
##  [25] 13502 13501 13404 13403 13402 13401 13303 13302 13301 13203 13202 13201
##  [37] 13132 13131 13130 13129 13128 13127 13126 13125 13124 13123 13122 13121
##  [49] 13120 13119 13118 13117 13116 13115 13114 13113 13112 13111 13110 13109
##  [61] 13108 13107 13106 13105 13104 13103 13102 13101 12402 12401 12303 12302
##  [73] 12301 12202 12201 12104 12103 12102 12101 11402 11401 11303 11302 11301
##  [85] 11203 11202 11201 11102 11101 10404 10403 10402 10401 10307 10306 10305
##  [97] 10304 10303 10302 10301 10210 10209 10208 10207 10206 10205 10204 10203
## [109] 10202 10201 10109 10108 10107 10106 10105 10104 10103 10102 10101  9211
## [121]  9210  9209  9208  9207  9206  9205  9204  9203  9202  9201  9121  9120
## [133]  9119  9118  9117  9116  9115  9114  9113  9112
  • Vemos que algunos códigos tienen 5 digitos y otros 4. Vamos a dejar ésto inalterado . Sin embargo, añadimos un trozo de código si en el futuro se desea agregar un cero previo a las comunas de 4 dígitos para homologar.
# recogemos el campo Comuna:
codigos <- x$COMUNA
# construimos una secuencia llamada rango del 1 al total de filas del dataset:
rango <- seq(1:nrow(x))
# Creamos un string que agrega un cero a todos los registros:
cadena<- paste("0",codigos[rango], sep = "")

# El string cadena tiene o 5 o 6 digitos, los cuales siempre deben ser siempre 5 agregandole un cero al inicio de los que tienen 4.
# Para ello extraemos un substring de la cadena sobre todas las filas (rangos) comenzando desde el primero o el segundo y llegando siempre al 6.

cadena <- substr(cadena,(nchar(cadena)[rango])-(4),6)
codigos <- as.data.frame(codigos)
cadena <- as.data.frame(cadena)
comuna_corr <- cbind(codigos,cadena)
  • Lo verificamos
lko <- unique(comuna_corr$cadena)

kbl(lko ) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  kable_paper() %>%
  scroll_box(width = "30%", height = "300px")
x
15202
15201
15102
15101
14204
14203
14202
14201
14108
14107
14106
14105
14104
14103
14102
14101
13605
13604
13603
13602
13601
13505
13504
13503
13502
13501
13404
13403
13402
13401
13303
13302
13301
13203
13202
13201
13132
13131
13130
13129
13128
13127
13126
13125
13124
13123
13122
13121
13120
13119
13118
13117
13116
13115
13114
13113
13112
13111
13110
13109
13108
13107
13106
13105
13104
13103
13102
13101
12402
12401
12303
12302
12301
12202
12201
12104
12103
12102
12101
11402
11401
11303
11302
11301
11203
11202
11201
11102
11101
10404
10403
10402
10401
10307
10306
10305
10304
10303
10302
10301
10210
10209
10208
10207
10206
10205
10204
10203
10202
10201
10109
10108
10107
10106
10105
10104
10103
10102
10101
09211
09210
09209
09208
09207
09206
09205
09204
09203
09202
09201
09121
09120
09119
09118
09117
09116
09115
09114
09113
09112
09111
09110
09109
09108
09107
09106
09105
09104
09103
09102
09101
16109
16207
16305
16108
16304
16301
16206
16201
16107
16205
16106
16105
16303
16204
16104
16103
16302
16203
16202
16102
16101
08314
08313
08312
08311
08310
08309
08308
08307
08306
08305
08304
08303
08302
08301
08207
08206
08205
08204
08203
08202
08201
08112
08111
08110
08109
08108
08107
08106
08105
08104
08103
08102
08101
07408
07407
07406
07405
07404
07403
07402
07401
07309
07308
07307
07306
07305
07304
07303
07302
07301
07203
07202
07201
07110
07109
07108
07107
07106
07105
07104
07103
07102
07101
06310
06309
06308
06307
06306
06305
06304
06303
06302
06301
06206
06205
06204
06203
06202
06201
06117
06116
06115
06114
06113
06112
06111
06110
06109
06108
06107
06106
06105
06104
06103
06102
06101
05804
05803
05802
05801
05706
05705
05704
05703
05702
05701
05606
05605
05604
05603
05602
05601
05506
05504
05503
05502
05501
05405
05404
05403
05402
05401
05304
05303
05302
05301
05201
05109
05107
05105
05104
05103
05102
05101
04305
04304
04303
04302
04301
04204
04203
04202
04201
04106
04105
04104
04103
04102
04101
03304
03303
03302
03301
03202
03201
03103
03102
03101
02302
02301
02203
02202
02201
02104
02103
02102
02101
01405
01404
01403
01402
01401
01107
01101

3 Analicemos la estructura del código de DC:

unique(x$DC)
##  [1]  1  2  3  4 99  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
## [26] 25 26 27 28 29 30 31 32 33

Debemos agregar un cero a la izquierda a todos los códigos DC que contengan un dígito:

# Le asignamos a la variable codigos, la variable DC del dataframe x:
codigos <- x$DC

# Creamos una secuencia llamada rango con toda la cantidad de registros del dataframe:
rango <- seq(1:nrow(x))

# Creamos un string que añade un cero a todos los codigos quedando algunos con dos dígitos y otros con tres: 
cadena <- paste("0",codigos[rango], sep = "")

# Ésta es la línea más importante del código. 
# Si el string entrante contiene tres digitos, la función substr comenzaría desde la posición 2 a la 3, y si tiene 2, comenzaría desde la posición 1 a la 3, pero como no existe posición tres, llega a la 2.

cadena <- substr(cadena,(nchar(cadena)[rango])-(1),(nchar(cadena)[rango]))

codigos <- as.data.frame(codigos)
cadena <- as.data.frame(cadena)
dc <- cbind(codigos,cadena)
  • Lo verificamos
unique(dc$cadena)
##  [1] "01" "02" "03" "04" "99" "05" "06" "07" "08" "09" "10" "11" "12" "13" "14"
## [16] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29"
## [31] "30" "31" "32" "33"

4 Analicemos la estructura del código de zc_loc:

a002 <- unique(x$ZC_LOC)

kbl(a002) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  kable_paper() %>%
  scroll_box(width = "30%", height = "300px")
x
6
8
12
15
4
5
9
11
901
1
2
10
14
13
999
7
21
3
20
17
16
39
33
38
48
23
35
43
50
28
32
37
42
49
24
26
29
36
40
46
47
19
22
25
34
45
18
27
30
31
44
54
55
41
52
53
51
61
69
60
57
72
71
64
65
70
74
63
73
75
67
56
58
76
66
59
62
68
78
80
77
79
81
87
88
83
84
82
85
86
89
93
91
90
105
113
95
103
108
99
104
107
111
112
100
96
101
92
94
98
106
109
110
115
122
123
124
116
120
114
117
119
121

Deben todos los codigos poseer tres dígitos, agregándole un cero a los que tienen 2 y dos ceros a los que tienen uno.

codigos <- x$ZC_LOC
rango <- seq(1:nrow(x))
cadena<- paste("00",codigos[rango], sep = "")
cadena <- substr(cadena,(nchar(cadena)[rango])-(2),nchar(cadena)[rango])
codigos <- as.data.frame(codigos)
cadena <- as.data.frame(cadena)
cadena_c <- cbind(codigos,cadena)

6 lo verificamos

unique(cadena_c$cadena)
##   [1] "006" "008" "012" "015" "004" "005" "009" "011" "901" "001" "002" "010"
##  [13] "014" "013" "999" "007" "021" "003" "020" "017" "016" "039" "033" "038"
##  [25] "048" "023" "035" "043" "050" "028" "032" "037" "042" "049" "024" "026"
##  [37] "029" "036" "040" "046" "047" "019" "022" "025" "034" "045" "018" "027"
##  [49] "030" "031" "044" "054" "055" "041" "052" "053" "051" "061" "069" "060"
##  [61] "057" "072" "071" "064" "065" "070" "074" "063" "073" "075" "067" "056"
##  [73] "058" "076" "066" "059" "062" "068" "078" "080" "077" "079" "081" "087"
##  [85] "088" "083" "084" "082" "085" "086" "089" "093" "091" "090" "105" "113"
##  [97] "095" "103" "108" "099" "104" "107" "111" "112" "100" "096" "101" "092"
## [109] "094" "098" "106" "109" "110" "115" "122" "123" "124" "116" "120" "114"
## [121] "117" "119" "121"

7 Unimos nuestra nueva clave a nuestro dataframe original con el nombre de campo clave:

x$clave <- paste(x$COMUNA, dc$cadena, x$AREA,  cadena_c$cadena, sep="")
  • Verificamos

Recordemos que:

COMUNA : Se mantiene igual.
DC : Siempre debe tener dos digitos anteponiendo un cero si tiene uno.
AREA : Se mantiene igual.
ZC_LOC : Siempre debe tener tres digitos anteponiendo un cero si tiene dos y dos si tiene uno.

tablamadre <- head(x,50)

kbl(tablamadre) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  kable_paper() %>%
  scroll_box(width = "100%", height = "300px")
REGION PROVINCIA COMUNA DC AREA ZC_LOC ID_ZONA_LOC NVIV NHOGAR TIPO_HOGAR TIPO_OPERATIVO clave
15 152 15202 1 2 6 13225 1 1 1 1 15202012006
15 152 15202 1 2 6 13225 3 1 6 1 15202012006
15 152 15202 1 2 6 13225 9 1 4 1 15202012006
15 152 15202 1 2 6 13225 10 1 1 1 15202012006
15 152 15202 1 2 6 13225 13 1 4 1 15202012006
15 152 15202 1 2 6 13225 16 1 3 1 15202012006
15 152 15202 1 2 6 13225 17 1 5 1 15202012006
15 152 15202 1 2 6 13225 18 1 1 1 15202012006
15 152 15202 1 2 6 13225 19 1 1 1 15202012006
15 152 15202 1 2 6 13225 20 1 3 1 15202012006
15 152 15202 1 2 6 13225 25 1 2 1 15202012006
15 152 15202 1 2 6 13225 28 1 5 1 15202012006
15 152 15202 1 2 6 13225 33 1 6 1 15202012006
15 152 15202 1 2 6 13225 36 1 6 1 15202012006
15 152 15202 1 2 6 13225 38 1 1 1 15202012006
15 152 15202 1 2 6 13225 39 1 3 1 15202012006
15 152 15202 1 2 6 13225 43 1 6 1 15202012006
15 152 15202 1 2 8 13910 5 1 4 1 15202012008
15 152 15202 1 2 8 13910 7 1 2 1 15202012008
15 152 15202 1 2 8 13910 8 1 3 1 15202012008
15 152 15202 1 2 8 13910 19 1 1 1 15202012008
15 152 15202 1 2 8 13910 21 1 3 1 15202012008
15 152 15202 1 2 8 13910 22 1 1 1 15202012008
15 152 15202 1 2 8 13910 30 1 1 1 15202012008
15 152 15202 1 2 12 8394 3 1 6 1 15202012012
15 152 15202 1 2 12 8394 9 1 1 1 15202012012
15 152 15202 1 2 12 8394 19 1 1 1 15202012012
15 152 15202 1 2 12 8394 20 1 1 1 15202012012
15 152 15202 1 2 12 8394 21 1 2 1 15202012012
15 152 15202 1 2 12 8394 24 1 3 1 15202012012
15 152 15202 1 2 12 8394 27 1 1 1 15202012012
15 152 15202 1 2 12 8394 31 1 1 1 15202012012
15 152 15202 1 2 12 8394 42 1 4 1 15202012012
15 152 15202 1 2 15 4094 2 1 1 1 15202012015
15 152 15202 1 2 15 4094 8 1 98 8 15202012015
15 152 15202 1 2 15 4094 9 1 1 1 15202012015
15 152 15202 1 2 15 4094 12 1 1 1 15202012015
15 152 15202 1 2 15 4094 15 1 2 1 15202012015
15 152 15202 1 2 15 4094 16 1 1 1 15202012015
15 152 15202 1 2 15 4094 19 1 7 1 15202012015
15 152 15202 1 2 15 4094 22 1 1 1 15202012015
15 152 15202 1 2 15 4094 27 1 7 1 15202012015
15 152 15202 1 2 15 4094 28 1 2 1 15202012015
15 152 15202 1 2 15 4094 29 1 6 1 15202012015
15 152 15202 1 2 15 4094 32 1 98 8 15202012015
15 152 15202 1 2 15 4094 46 1 7 1 15202012015
15 152 15202 1 2 15 4094 47 1 6 1 15202012015
15 152 15202 1 2 15 4094 49 1 1 1 15202012015
15 152 15202 1 2 15 4094 51 1 1 1 15202012015
15 152 15202 1 2 15 4094 52 1 7 1 15202012015
unicas <- unique(x$clave)
codigos_unicos <- head(unicas,50)

kbl(codigos_unicos) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  kable_paper() %>%
  scroll_box(width = "100%", height = "300px")
x
15202012006
15202012008
15202012012
15202012015
15202022004
15202022005
15202022009
15202022011
15202022901
15202032001
15202032002
15202032010
15202032014
15202032901
15202042013
15202042901
15202992999
15201011001
15201012901
15201022002
15201032006
15201032007
15201032901
15201042009
15201042021
15201042901
15201052001
15201052003
15201052012
15201052013
15201052020
15201052901
15201062005
15201062010
15201062017
15201062901
15201072901
15201082004
15201991999
15102012002
15102012003
15102022007
15102032005
15102032008
15102032901
15102042001
15102052004
15102052006
15101011001
15101011002


Parte II: Generación de las tablas de contingencia:

El Censo 2017 contempla dos preguntas:

1 TIPO_HOGAR Tipo de hogar.

tabla_TIPO_HOGAR <- table(x$clave, x$TIPO_HOGAR, useNA = "no")

colnames(tabla_TIPO_HOGAR) <- c("Hogar unipersonal","Hogar nuclear monoparental","Hogar nuclear biparental sin hijos","Hogar nuclear biparental con hijos","Hogar compuesto","Hogar extenso","Hogar sin núcleo","No aplica
")

write.table(tabla_TIPO_HOGAR,"tabla_TIPO_OPERATIVO_df.txt", col.name = NA)
tabla <- read.table("tabla_TIPO_OPERATIVO_df.txt")
# tabla <- as.table(tabla_TIPO_OPERATIVO)
tabla_names <- tabla[1,]
colnames(tabla) <- tabla_names
tabla <- tabla[-1,]
names(tabla)[1] <- "Clave"

write_xlsx(tabla, "tablas_2017_hogares/tabla_TIPO_HOGAR.xlsx")
a001 <- head(tabla_TIPO_HOGAR,5)
kbl(a001) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  kable_paper() %>%
  scroll_box(width = "100%", height = "300px")
Hogar unipersonal Hogar nuclear monoparental Hogar nuclear biparental sin hijos Hogar nuclear biparental con hijos Hogar compuesto Hogar extenso Hogar sin núcleo No aplica
10101011001 84 8 35 16 4 16 23 19
10101011002 301 115 142 186 41 178 104 5
10101021001 297 155 177 278 50 262 122 6
10101021002 94 33 63 44 12 53 44 25
10101021003 236 82 88 124 35 132 99 32

2 TIPO_OPERATIVO Tipo de operativo.

tabla_TIPO_OPERATIVO <- table(x$clave, x$TIPO_OPERATIVO, useNA = "no")

colnames(tabla_TIPO_OPERATIVO) <- c("Hogar en vivienda particular","Vivienda colectiva (no es hogar)","Operativo personas en tránsito (no es hogar)","Operativo calle (no es hogar)")

write.table(tabla_TIPO_OPERATIVO,"tabla_TIPO_OPERATIVO_df.txt", col.name = NA)
tabla <- read.table("tabla_TIPO_OPERATIVO_df.txt")
# tabla <- as.table(tabla_TIPO_OPERATIVO)
tabla_names <- tabla[1,]
colnames(tabla) <- tabla_names
tabla <- tabla[-1,]
names(tabla)[1] <- "Clave"

write_xlsx(tabla, "tablas_2017_hogares/tabla_TIPO_OPERATIVO.xlsx")
a001 <- head(tabla_TIPO_OPERATIVO,5)
kbl(a001) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  kable_paper() %>%
  scroll_box(width = "100%", height = "300px")
Hogar en vivienda particular Vivienda colectiva (no es hogar) Operativo personas en tránsito (no es hogar) Operativo calle (no es hogar)
10101011001 186 19 0 0
10101011002 1067 5 0 0
10101021001 1341 6 0 0
10101021002 343 25 0 0
10101021003 796 32 0 0