Limpieza de Datos

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?