Recuerda: Para poder hacer merge debo tener dos elementos en común
¡Empezamos!
Recuerda establecer bien tu Working Directory. En este caso, estoy trabajando con una carpeta llamada ‘course’, que tiene una subcarpeta llamada ‘data’. Dentro de ‘data’, está el archivo ideDirty.xlsx.
[Por eso es que hago file.path]
Buscamos openxlsx en packages y le damos clic. De esa manera activamos el paquete. De todos modos, escribo el código:
library(openxlsx)
Ahora cargo mi data ideDirty:
folder="data"
fileName="ideDirty.xlsx"
fileToRead=file.path(folder,fileName)
datos=openxlsx::read.xlsx(fileToRead,skipEmptyRows=TRUE,skipEmptyCols=TRUE,startRow=2) #pongo skipEmptyRows y skipEmptyCols para eliminar filas y columnas vacías; y pongo startRow=2 para que ya no empiece leyendo desde la primera fila (ya que ahí hay texto que no me sirve) sino desde la segunda fila)
Veamos mi data. Primero las primeras filas:
head(datos)
## Ubigeo.2010 DEPARTAMENTO X3 X4 X5
## 1 <NA> <NA> <NA> Población 2012 <NA>
## 2 <NA> <NA> Provincia <NA> <NA>
## 3 <NA> <NA> Distrito habitantes ranking
## 4 000000 PERÚ a/ <NA> 30135875 -
## 5 010000 AMAZONAS <NA> 417508 20
## 6 010100 <NA> Chachapoyas 54783 113
## IDE X7
## 1 Índice de Densidad del Estado <NA>
## 2 <NA> <NA>
## 3 IDE ranking
## 4 0.76662632867783975 -
## 5 0.62795269269252496 20
## 6 0.77369947765747837 26
## IDENTIDAD X9
## 1 Población con acta nacimiento o DNI <NA>
## 2 <NA> <NA>
## 3 % ranking
## 4 98.313826338129147 -
## 5 94.942033052925879 24
## 6 98.617881202736541 59
## SALUD X11
## 1 Médicos por cada 10,000 habitantes <NA>
## 2 <NA> <NA>
## 3 Razon ranking
## 4 22.731906420779179 -
## 5 13.313367648045066 14
## 6 25.450023719049433 13
## EDUCACIÓN X13
## 1 Tasa asistencia a Secundaria (Pob. 12 a 16 años) <NA>
## 2 <NA> <NA>
## 3 % ranking
## 4 84.988401001675385 -
## 5 76.328274672064708 24
## 6 91.498562457256497 32
## SANEAMIENTO X15 ELECTRIFICACIÓN X17
## 1 Viviendas con agua y desague <NA> Viviendas electrificadas <NA>
## 2 <NA> <NA> <NA> <NA>
## 3 % ranking % Ranking
## 4 76.01277746565404 - 86.111648832162686 -
## 5 54.35445620734103 17 66.162636333855772 24
## 6 70.345402142059839 54 83.971186828270632 52
Y ahora las últimas filas:
tail(datos)
## Ubigeo.2010
## 222 250300
## 223 250400
## 224 a/ Incluye las cifras estimadas del distrito de Carmen Alto en la provincia de Huamanga, departamento de Ayacucho, donde. Autoridades locales no permitieron la ejecución del Censo de Población y Vivienda 2007.
## 225 1/ Incluye a la población ubicada en área temporal por límites de fronteras de los distritos de Pangoa y Mazamari.
## 226 Fuente: INEI. Censo de Población y Vivienda 2007. ENAHO 2012 y ENAPRES 2012.
## 227 Elaboración: PNUD-Perú.
## DEPARTAMENTO X3 X4 X5 IDE X7
## 222 <NA> Padre Abad 56756 110 0.50228956632535726 183
## 223 <NA> Purús 4251 194 0.44730062147882388 192
## 224 <NA> <NA> <NA> <NA> <NA> <NA>
## 225 <NA> <NA> <NA> <NA> <NA> <NA>
## 226 <NA> <NA> <NA> <NA> <NA> <NA>
## 227 <NA> <NA> <NA> <NA> <NA> <NA>
## IDENTIDAD X9 SALUD X11 EDUCACIÓN
## 222 97.308658165995382 119 4.4983536970260021 183 73.201298039750611
## 223 91.966721351829577 187 15.954234068771099 43 51.387770384475495
## 224 <NA> <NA> <NA> <NA> <NA>
## 225 <NA> <NA> <NA> <NA> <NA>
## 226 <NA> <NA> <NA> <NA> <NA>
## 227 <NA> <NA> <NA> <NA> <NA>
## X13 SANEAMIENTO X15 ELECTRIFICACIÓN X17
## 222 149 13.243004030431669 192 59.894566764790994 149
## 223 192 0.2350539782405858 194 53.470374910247763 167
## 224 <NA> <NA> <NA> <NA> <NA>
## 225 <NA> <NA> <NA> <NA> <NA>
## 226 <NA> <NA> <NA> <NA> <NA>
## 227 <NA> <NA> <NA> <NA> <NA>
Veo que de las 224 a la 227 no me sirven. Las elimino [y la eliminación la chanco sobre mi data]:
datos=datos[-c(224:227),]
Ahora veo cómo ha quedado. Veo las últimas filas:
tail(datos)
## Ubigeo.2010 DEPARTAMENTO X3 X4 X5
## 218 240300 <NA> Zarumilla 49499 126
## 219 250000 UCAYALI <NA> 477616 18
## 220 250100 <NA> Coronel Portillo 366040 11
## 221 250200 <NA> Atalaya 50569 124
## 222 250300 <NA> Padre Abad 56756 110
## 223 250400 <NA> Purús 4251 194
## IDE X7 IDENTIDAD X9 SALUD X11
## 218 0.68490566248027684 65 97.475401341834555 112 6.975792584828052 135
## 219 0.62020628527051502 23 96.157880366150223 23 10.750006281196608 20
## 220 0.66701863370920866 76 97.592178100974792 109 12.51950889699271 67
## 221 0.42451367777965016 194 84.289457132883669 193 4.5206342203728447 181
## 222 0.50228956632535726 183 97.308658165995382 119 4.4983536970260021 183
## 223 0.44730062147882388 192 91.966721351829577 187 15.954234068771099 43
## EDUCACIÓN X13 SANEAMIENTO X15 ELECTRIFICACIÓN X17
## 218 81.208657536492311 106 71.022713087326167 52 81.119738299771953 60
## 219 80.819958319397699 19 35.612859113715892 24 79.595767700666016 14
## 220 85.428608047366026 69 42.851140702133897 139 86.771541842475131 43
## 221 55.46518686152001 188 13.242539375040446 193 51.725265153092849 170
## 222 73.201298039750611 149 13.243004030431669 192 59.894566764790994 149
## 223 51.387770384475495 192 0.2350539782405858 194 53.470374910247763 167
La última fila es Purús. Estamos bien.
Ahora eliminemos filas innecesarias al principio de mi data. Saco head:
head(datos)
## Ubigeo.2010 DEPARTAMENTO X3 X4 X5
## 1 <NA> <NA> <NA> Población 2012 <NA>
## 2 <NA> <NA> Provincia <NA> <NA>
## 3 <NA> <NA> Distrito habitantes ranking
## 4 000000 PERÚ a/ <NA> 30135875 -
## 5 010000 AMAZONAS <NA> 417508 20
## 6 010100 <NA> Chachapoyas 54783 113
## IDE X7
## 1 Índice de Densidad del Estado <NA>
## 2 <NA> <NA>
## 3 IDE ranking
## 4 0.76662632867783975 -
## 5 0.62795269269252496 20
## 6 0.77369947765747837 26
## IDENTIDAD X9
## 1 Población con acta nacimiento o DNI <NA>
## 2 <NA> <NA>
## 3 % ranking
## 4 98.313826338129147 -
## 5 94.942033052925879 24
## 6 98.617881202736541 59
## SALUD X11
## 1 Médicos por cada 10,000 habitantes <NA>
## 2 <NA> <NA>
## 3 Razon ranking
## 4 22.731906420779179 -
## 5 13.313367648045066 14
## 6 25.450023719049433 13
## EDUCACIÓN X13
## 1 Tasa asistencia a Secundaria (Pob. 12 a 16 años) <NA>
## 2 <NA> <NA>
## 3 % ranking
## 4 84.988401001675385 -
## 5 76.328274672064708 24
## 6 91.498562457256497 32
## SANEAMIENTO X15 ELECTRIFICACIÓN X17
## 1 Viviendas con agua y desague <NA> Viviendas electrificadas <NA>
## 2 <NA> <NA> <NA> <NA>
## 3 % ranking % Ranking
## 4 76.01277746565404 - 86.111648832162686 -
## 5 54.35445620734103 17 66.162636333855772 24
## 6 70.345402142059839 54 83.971186828270632 52
Las filas 1,2,3 y 4 no me sirven [¿recuerdas que en el Excel las eliminamos?]. Las elimino:
datos=datos[-c(1:4),]
Veamos cómo quedó. Vuelvo a sacar head:
head(datos)
## Ubigeo.2010 DEPARTAMENTO X3 X4 X5 IDE
## 5 010000 AMAZONAS <NA> 417508 20 0.62795269269252496
## 6 010100 <NA> Chachapoyas 54783 113 0.77369947765747837
## 7 010200 <NA> Bagua 77438 79 0.66228046503747584
## 8 010300 <NA> Bongará 32317 145 0.63182491983336697
## 9 010400 <NA> Condorcanqui 51802 119 0.45982417359739747
## 10 010500 <NA> Luya 52185 117 0.60471977563772472
## X7 IDENTIDAD X9 SALUD X11 EDUCACIÓN
## 5 20 94.942033052925879 24 13.313367648045066 14 76.328274672064708
## 6 26 98.617881202736541 59 25.450023719049433 13 91.498562457256497
## 7 82 94.607868232246133 180 14.609120874914693 49 79.790177700938358
## 8 103 97.468069451399515 113 9.0102065354508269 114 76.424036582846838
## 9 191 86.231962490583811 192 8.5569592849723382 120 52.214935311064806
## 10 126 96.192721992265234 155 12.418003208422093 70 74.725966346695259
## X13 SANEAMIENTO X15 ELECTRIFICACIÓN X17
## 5 24 54.35445620734103 17 66.162636333855772 24
## 6 32 70.345402142059839 54 83.971186828270632 52
## 7 114 64.479036686809536 67 67.91461510721939 119
## 8 133 54.834081786102814 96 72.169261203916292 105
## 9 191 37.714508854591834 156 39.489081334171054 191
## 10 143 43.348418298915448 136 67.396109166949586 123
¡Vamos bien!
Ahora, empiezo a eliminar columnas. Primero, veamos qué columnas tengo. Saco names:
names(datos)
## [1] "Ubigeo.2010" "DEPARTAMENTO" "X3"
## [4] "X4" "X5" "IDE"
## [7] "X7" "IDENTIDAD" "X9"
## [10] "SALUD" "X11" "EDUCACIÓN"
## [13] "X13" "SANEAMIENTO" "X15"
## [16] "ELECTRIFICACIÓN" "X17"
No me sirven las columnas X4, X5, X7, X9, X11, X13, X15 y X17. Las elimino [nótese cómo estoy usando seq]:
datos=datos[,-c(4,seq(5,17,2))]
Veo cómo vamos:
head(datos)
## Ubigeo.2010 DEPARTAMENTO X3 IDE
## 5 010000 AMAZONAS <NA> 0.62795269269252496
## 6 010100 <NA> Chachapoyas 0.77369947765747837
## 7 010200 <NA> Bagua 0.66228046503747584
## 8 010300 <NA> Bongará 0.63182491983336697
## 9 010400 <NA> Condorcanqui 0.45982417359739747
## 10 010500 <NA> Luya 0.60471977563772472
## IDENTIDAD SALUD EDUCACIÓN
## 5 94.942033052925879 13.313367648045066 76.328274672064708
## 6 98.617881202736541 25.450023719049433 91.498562457256497
## 7 94.607868232246133 14.609120874914693 79.790177700938358
## 8 97.468069451399515 9.0102065354508269 76.424036582846838
## 9 86.231962490583811 8.5569592849723382 52.214935311064806
## 10 96.192721992265234 12.418003208422093 74.725966346695259
## SANEAMIENTO ELECTRIFICACIÓN
## 5 54.35445620734103 66.162636333855772
## 6 70.345402142059839 83.971186828270632
## 7 64.479036686809536 67.91461510721939
## 8 54.834081786102814 72.169261203916292
## 9 37.714508854591834 39.489081334171054
## 10 43.348418298915448 67.396109166949586
Veamos los nombres de las columnas que quedaron:
names(datos)
## [1] "Ubigeo.2010" "DEPARTAMENTO" "X3" "IDE"
## [5] "IDENTIDAD" "SALUD" "EDUCACIÓN" "SANEAMIENTO"
## [9] "ELECTRIFICACIÓN"
Aún dice X3. Cambiemos X3 por PROVINCIA:
names(datos)[3]="PROVINCIA"
Ahora veo nuevamente los nombres:
names(datos)
## [1] "Ubigeo.2010" "DEPARTAMENTO" "PROVINCIA" "IDE"
## [5] "IDENTIDAD" "SALUD" "EDUCACIÓN" "SANEAMIENTO"
## [9] "ELECTRIFICACIÓN"
¿Cómo separo los departamentos? La información de mi interés están en las columnas 1 y 2.
¿Cómo separo las provincias? La información de mi interés es todo menos el 2.
Creo objetos:
depas=datos[,c(1,2)]
provs=datos[,-c(2)]
Ahora formateo mi objeto depas usando complete.cases:
depas=depas[complete.cases(depas$DEPARTAMENTO),]
Ahora formateo mi objeto provs, también usando complete.cases:
provs=provs[complete.cases(provs$PROVINCIA),]
¡Ya tengo mis depas y mis provs!
Ahora tengo que generar el ubigeo de departamentos. Trabajemos haciéndolo desde las provs. Crearé la columna ubiDepa:
El equivalente a la función IZQUIERDA de Excel es substr. Y a eso le añadiré “0000” [eso lo hago con paste0]:
provs$ubiDepa=paste0(substr(provs$Ubigeo.2010,1,2),"0000")
Veo la columna creada. Saco head de provs:
head(provs)
## Ubigeo.2010 PROVINCIA IDE IDENTIDAD
## 6 010100 Chachapoyas 0.77369947765747837 98.617881202736541
## 7 010200 Bagua 0.66228046503747584 94.607868232246133
## 8 010300 Bongará 0.63182491983336697 97.468069451399515
## 9 010400 Condorcanqui 0.45982417359739747 86.231962490583811
## 10 010500 Luya 0.60471977563772472 96.192721992265234
## 11 010600 Rodríguez de Mendoza 0.63122642672378437 97.343101025328792
## SALUD EDUCACIÓN SANEAMIENTO
## 6 25.450023719049433 91.498562457256497 70.345402142059839
## 7 14.609120874914693 79.790177700938358 64.479036686809536
## 8 9.0102065354508269 76.424036582846838 54.834081786102814
## 9 8.5569592849723382 52.214935311064806 37.714508854591834
## 10 12.418003208422093 74.725966346695259 43.348418298915448
## 11 14.87868246110053 79.424387744349531 46.501816616265728
## ELECTRIFICACIÓN ubiDepa
## 6 83.971186828270632 010000
## 7 67.91461510721939 010000
## 8 72.169261203916292 010000
## 9 39.489081334171054 010000
## 10 67.396109166949586 010000
## 11 67.546103874113939 010000
Ahora cambiamos el nombre de la columna de ubigeo en depas:
names(depas)[1]="ubiDepa"
Ahora sí hacemos el merge, y guardo el data frame como ideLimpio:
ideLimpio=merge(provs,depas)
¡Listo! ¿Fácil, no?