Capítulo 5 Comprobar presencia o ausencia de un registros en un data frame con información adicional

5.1 Planteamiento

  • Dado un data frame de referencia con un listado de registros identificados por un código único.
  • Dado otros data frames con información adicional de todos o algunos de los registros inluidos en el data frame de referencia identificados con el mísmo código único.
  • Interesa incluir en el data frame de referencia, información sobre que elementos de este data frame de referencia tienen información adicional y cuales no.

5.2 Datos de partida

Se dispone de los siguientes data frames:

  • dfFus: Data frame de referencia con el lisado completo de los registros
  • dfLx: Data frame con información adicional de un determinado grupo de registros.
  • dfNy: Data frame con información adicional de un grupo de otro grupo de registros.

Características:

  • Todos los registros incluidos en dfLx y todos los registros incluidos en dfNy, están incluidos en dfFus
  • Hay registros de dfFus que no están ni en dfLx ni en dfNy
  • Hay registros que están incluidos en dfLx y en dfNy
  • Hay registros que estań en dfLx o en dfNy pero no en ambos

5.3 Información adicional en dfLx

Los códigos de los registros que tienen información adicional en dfLx están identificados en dfLx$IdL.

Se genera el vector con estos valores: VInL = dfLx$Idl

En el data frame de referencia dfFus, se añade una nueva columna:

  • Se le asigna el nombre test L = TeL
  • El valor es de tipo TRUE/FALSE, con el siguiente criterio
    • Si el registro está incluido en VInL –> TRUE
    • Si el registro NO está incluido en VInL –> FALSE

Código:

  • dfFus$TeL = FALSE: Se genera la nueva columna y se le asigna FALSE como valor por defecto - dfFus$TeL[dfFus$IdL %in% VInL] = TRUE: Se utiliza el operador %in% asignar el valor TRUE a dfFusTeLcuandoidentificadordfFusIdL está incluido en el vector VInL
dfFus$TeL = FALSE
dfFus$TeL[dfFus$IdL %in% VInL] = TRUE
##     IdL        Ltr Nmr   TeL
## 1     1  Alcachofa   1 FALSE
## 2     2   Coliflor   1  TRUE
## 3     3   Adelante   1 FALSE
## 4     4 Agricultor   1  TRUE
## 5     5  Alcachofa   2 FALSE
## 6     6   Coliflor   2  TRUE
## 7     7   Adelante   2 FALSE
## 8     8 Agricultor   2  TRUE
## 9     9  Alcachofa   3 FALSE
## 10   10   Coliflor   3  TRUE
## 11   11   Adelante   3 FALSE
## 12   12 Agricultor   3  TRUE
## 13   13  Alcachofa   4 FALSE
## 14   14   Coliflor   4  TRUE
## 15   15   Adelante   4 FALSE
## 16   16 Agricultor   4  TRUE
## 17   17  Alcachofa   5 FALSE
## 18   18   Coliflor   5  TRUE
## 19   19   Adelante   5 FALSE
## 20   20 Agricultor   5  TRUE
## 21   21  Alcachofa   6 FALSE
## 22   22   Coliflor   6  TRUE
## 23   23   Adelante   6 FALSE
## 24   24 Agricultor   6  TRUE
## 25   25  Alcachofa   7 FALSE
## 26   26   Coliflor   7  TRUE
## 27   27   Adelante   7 FALSE
## 28   28 Agricultor   7  TRUE
## 29   29  Alcachofa   8 FALSE
## 30   30   Coliflor   8  TRUE
## 31   31   Adelante   8 FALSE
## 32   32 Agricultor   8  TRUE
## 33   33  Alcachofa   9 FALSE
## 34   34   Coliflor   9  TRUE
## 35   35   Adelante   9 FALSE
## 36   36 Agricultor   9  TRUE
## 37   37  Alcachofa  10 FALSE
## 38   38   Coliflor  10  TRUE
## 39   39   Adelante  10 FALSE
## 40   40 Agricultor  10  TRUE
## 41   41  Alcachofa  11 FALSE
## 42   42   Coliflor  11  TRUE
## 43   43   Adelante  11 FALSE
## 44   44 Agricultor  11  TRUE
## 45   45  Alcachofa  12 FALSE
## 46   46   Coliflor  12  TRUE
## 47   47   Adelante  12 FALSE
## 48   48 Agricultor  12  TRUE
## 49   49  Alcachofa  13 FALSE
## 50   50   Coliflor  13  TRUE
## 51   51   Adelante  13 FALSE
## 52   52 Agricultor  13  TRUE
## 53   53  Alcachofa  14 FALSE
## 54   54   Coliflor  14  TRUE
## 55   55   Adelante  14 FALSE
## 56   56 Agricultor  14  TRUE
## 57   57  Alcachofa  15 FALSE
## 58   58   Coliflor  15  TRUE
## 59   59   Adelante  15 FALSE
## 60   60 Agricultor  15  TRUE
## 61   61  Alcachofa  16 FALSE
## 62   62   Coliflor  16  TRUE
## 63   63   Adelante  16 FALSE
## 64   64 Agricultor  16  TRUE
## 65   65  Alcachofa  17 FALSE
## 66   66   Coliflor  17  TRUE
## 67   67   Adelante  17 FALSE
## 68   68 Agricultor  17  TRUE
## 69   69  Alcachofa  18 FALSE
## 70   70   Coliflor  18  TRUE
## 71   71   Adelante  18 FALSE
## 72   72 Agricultor  18  TRUE
## 73   73  Alcachofa  19 FALSE
## 74   74   Coliflor  19  TRUE
## 75   75   Adelante  19 FALSE
## 76   76 Agricultor  19  TRUE
## 77   77  Alcachofa  20 FALSE
## 78   78   Coliflor  20  TRUE
## 79   79   Adelante  20 FALSE
## 80   80 Agricultor  20  TRUE
## 81   81  Alcachofa  21 FALSE
## 82   82   Coliflor  21  TRUE
## 83   83   Adelante  21 FALSE
## 84   84 Agricultor  21  TRUE
## 85   85  Alcachofa  22 FALSE
## 86   86   Coliflor  22  TRUE
## 87   87   Adelante  22 FALSE
## 88   88 Agricultor  22  TRUE
## 89   89  Alcachofa  23 FALSE
## 90   90   Coliflor  23  TRUE
## 91   91   Adelante  23 FALSE
## 92   92 Agricultor  23  TRUE
## 93   93  Alcachofa  24 FALSE
## 94   94   Coliflor  24  TRUE
## 95   95   Adelante  24 FALSE
## 96   96 Agricultor  24  TRUE
## 97   97  Alcachofa  25 FALSE
## 98   98   Coliflor  25  TRUE
## 99   99   Adelante  25 FALSE
## 100 100 Agricultor  25  TRUE

5.4 Información adicional en dfNy

Los códigos de los registros que tienen información adicional en dfLx están identificados en dfNy$IdN.

Se genera el vector con estos valores: VInN = dfNy$IdN

En el data frame de referencia dfFus, se añade una nueva columna:

  • Se le asigna el nombre test N = TeN
  • El valor es de tipo TRUE/FALSE, con el siguiente criterio
    • Si el registro está incluido en VInN –> TRUE
    • Si el registro NO está incluido en VInN –> FALSE
##     IdL        Ltr Nmr   TeL   TeN
## 1     1  Alcachofa   1 FALSE FALSE
## 2     2   Coliflor   1  TRUE FALSE
## 3     3   Adelante   1 FALSE  TRUE
## 4     4 Agricultor   1  TRUE FALSE
## 5     5  Alcachofa   2 FALSE FALSE
## 6     6   Coliflor   2  TRUE  TRUE
## 7     7   Adelante   2 FALSE FALSE
## 8     8 Agricultor   2  TRUE FALSE
## 9     9  Alcachofa   3 FALSE  TRUE
## 10   10   Coliflor   3  TRUE FALSE
## 11   11   Adelante   3 FALSE FALSE
## 12   12 Agricultor   3  TRUE  TRUE
## 13   13  Alcachofa   4 FALSE FALSE
## 14   14   Coliflor   4  TRUE FALSE
## 15   15   Adelante   4 FALSE  TRUE
## 16   16 Agricultor   4  TRUE FALSE
## 17   17  Alcachofa   5 FALSE FALSE
## 18   18   Coliflor   5  TRUE  TRUE
## 19   19   Adelante   5 FALSE FALSE
## 20   20 Agricultor   5  TRUE FALSE
## 21   21  Alcachofa   6 FALSE  TRUE
## 22   22   Coliflor   6  TRUE FALSE
## 23   23   Adelante   6 FALSE FALSE
## 24   24 Agricultor   6  TRUE  TRUE
## 25   25  Alcachofa   7 FALSE FALSE
## 26   26   Coliflor   7  TRUE FALSE
## 27   27   Adelante   7 FALSE  TRUE
## 28   28 Agricultor   7  TRUE FALSE
## 29   29  Alcachofa   8 FALSE FALSE
## 30   30   Coliflor   8  TRUE  TRUE
## 31   31   Adelante   8 FALSE FALSE
## 32   32 Agricultor   8  TRUE FALSE
## 33   33  Alcachofa   9 FALSE  TRUE
## 34   34   Coliflor   9  TRUE FALSE
## 35   35   Adelante   9 FALSE FALSE
## 36   36 Agricultor   9  TRUE  TRUE
## 37   37  Alcachofa  10 FALSE FALSE
## 38   38   Coliflor  10  TRUE FALSE
## 39   39   Adelante  10 FALSE  TRUE
## 40   40 Agricultor  10  TRUE FALSE
## 41   41  Alcachofa  11 FALSE FALSE
## 42   42   Coliflor  11  TRUE  TRUE
## 43   43   Adelante  11 FALSE FALSE
## 44   44 Agricultor  11  TRUE FALSE
## 45   45  Alcachofa  12 FALSE  TRUE
## 46   46   Coliflor  12  TRUE FALSE
## 47   47   Adelante  12 FALSE FALSE
## 48   48 Agricultor  12  TRUE  TRUE
## 49   49  Alcachofa  13 FALSE FALSE
## 50   50   Coliflor  13  TRUE FALSE
## 51   51   Adelante  13 FALSE  TRUE
## 52   52 Agricultor  13  TRUE FALSE
## 53   53  Alcachofa  14 FALSE FALSE
## 54   54   Coliflor  14  TRUE  TRUE
## 55   55   Adelante  14 FALSE FALSE
## 56   56 Agricultor  14  TRUE FALSE
## 57   57  Alcachofa  15 FALSE  TRUE
## 58   58   Coliflor  15  TRUE FALSE
## 59   59   Adelante  15 FALSE FALSE
## 60   60 Agricultor  15  TRUE  TRUE
## 61   61  Alcachofa  16 FALSE FALSE
## 62   62   Coliflor  16  TRUE FALSE
## 63   63   Adelante  16 FALSE  TRUE
## 64   64 Agricultor  16  TRUE FALSE
## 65   65  Alcachofa  17 FALSE FALSE
## 66   66   Coliflor  17  TRUE  TRUE
## 67   67   Adelante  17 FALSE FALSE
## 68   68 Agricultor  17  TRUE FALSE
## 69   69  Alcachofa  18 FALSE  TRUE
## 70   70   Coliflor  18  TRUE FALSE
## 71   71   Adelante  18 FALSE FALSE
## 72   72 Agricultor  18  TRUE  TRUE
## 73   73  Alcachofa  19 FALSE FALSE
## 74   74   Coliflor  19  TRUE FALSE
## 75   75   Adelante  19 FALSE  TRUE
## 76   76 Agricultor  19  TRUE FALSE
## 77   77  Alcachofa  20 FALSE FALSE
## 78   78   Coliflor  20  TRUE  TRUE
## 79   79   Adelante  20 FALSE FALSE
## 80   80 Agricultor  20  TRUE FALSE
## 81   81  Alcachofa  21 FALSE  TRUE
## 82   82   Coliflor  21  TRUE FALSE
## 83   83   Adelante  21 FALSE FALSE
## 84   84 Agricultor  21  TRUE  TRUE
## 85   85  Alcachofa  22 FALSE FALSE
## 86   86   Coliflor  22  TRUE FALSE
## 87   87   Adelante  22 FALSE  TRUE
## 88   88 Agricultor  22  TRUE FALSE
## 89   89  Alcachofa  23 FALSE FALSE
## 90   90   Coliflor  23  TRUE  TRUE
## 91   91   Adelante  23 FALSE FALSE
## 92   92 Agricultor  23  TRUE FALSE
## 93   93  Alcachofa  24 FALSE  TRUE
## 94   94   Coliflor  24  TRUE FALSE
## 95   95   Adelante  24 FALSE FALSE
## 96   96 Agricultor  24  TRUE  TRUE
## 97   97  Alcachofa  25 FALSE FALSE
## 98   98   Coliflor  25  TRUE FALSE
## 99   99   Adelante  25 FALSE  TRUE
## 100 100 Agricultor  25  TRUE FALSE

5 Generación de data frames vacios

Para generar un data frame se utiliza la función data.frame(). Si no se especifican ningún valor para los parámetros de la función, se genera un data frame vacio.

La función admite datos de entrada, características de las filas y columanas, etc. Aquí o aquí se pueden ver algunas posibilidades.

Generamos dos data frames vacíos a los que después añadiremos datos y fusionaremos.

5.1 Data frame dfLtr vacío

dfLtr = data.frame()
  • paste0("dfLtr[", nrow(dfLtr), " Filas, ", ncol(dfLtr), " Columnas]")
    • dfLtr[0 Filas, 0 Columnas]

5.2 Data frame dfNmr vacío

dfNmr = data.frame()
  • paste0("dfNmr[", nrow(dfNmr), " Filas, ", ncol(dfNmr), " Columnas]")
    • dfNmr[0 Filas, 0 Columnas]

6 Añadido de columna de códigos de identificación

Se añade una columna de identificador del registro común a los dos data frames. Está columna servirá después de referencia para fusionar los dos data frames.

La sintaxis para identificar las filas y columnas de un data frame es [filas, columnas]. Si el espacio correspondiente a las filas y/o columnas se deja en blanco, se toman todas las filas y/o todas las columnas respectivamente.

Para añadir un vector a una columna de un data frame vacío es necesario identificar el intervalo de filas y el número de la columna.

Utilizamos el el operador “:” para generar una serie de números desde el 1 al 100.

6.1 Data frame dfLtr con la columna de identificadores

dfLtr[1:100, 1] = 1:100
  • paste0("dfLtr[", nrow(dfLtr), " Filas, ", ncol(dfLtr), " Columnas]")
    • dfLtr[100 Filas, 1 Columnas]
print(dfLtr[1:10,])
summary(dfLtr)
##  [1]  1  2  3  4  5  6  7  8  9 10
##        V1        
##  Min.   :  1.00  
##  1st Qu.: 25.75  
##  Median : 50.50  
##  Mean   : 50.50  
##  3rd Qu.: 75.25  
##  Max.   :100.00

6.2 Data frame dfNmr con la columna de identificadores

dfLtr[1:100, 1] = 1:100
  • paste0("dfNmr[", nrow(dfNmr), " Filas, ", ncol(dfNmr), " Columnas]")
    • dfNmr[100 Filas, 1 Columnas]
print(dfNmr[1:10,])
summary(dfNmr)
##  [1]  1  2  3  4  5  6  7  8  9 10
##        V1        
##  Min.   :  1.00  
##  1st Qu.: 25.75  
##  Median : 50.50  
##  Mean   : 50.50  
##  3rd Qu.: 75.25  
##  Max.   :100.00

7 Añadido de la columna específica de cada data frame

7.1 Data frame dfLtr

En el data frame dfLtr añadimos una columna de tipo character. Tomamos un vector de 4 elementos tipo character V01 = c(“Alcachofa,” “Coliflor,” “Adelante,” “Agricultor”)

Para la segunda columna del data frame dfLtr utilizamos la función rep() para generar una serie de 100 elementos repitiendo 25 veces los 4 elementos del vector V01:

dfLtr[1:100, 2] = rep(x = V01, times = 25)
  • paste0("dfLtr[", nrow(dfLtr), " Filas, ", ncol(dfLtr), " Columnas]")
    • dfLtr[100 Filas, 2 Columnas]

En este punto, el data frame dfLtr ya tiene dos columnas

print(dfLtr[1:10,])
summary(dfLtr)
##    V1         V2
## 1   1  Alcachofa
## 2   2   Coliflor
## 3   3   Adelante
## 4   4 Agricultor
## 5   5  Alcachofa
## 6   6   Coliflor
## 7   7   Adelante
## 8   8 Agricultor
## 9   9  Alcachofa
## 10 10   Coliflor
##        V1              V2           
##  Min.   :  1.00   Length:100        
##  1st Qu.: 25.75   Class :character  
##  Median : 50.50   Mode  :character  
##  Mean   : 50.50                     
##  3rd Qu.: 75.25                     
##  Max.   :100.00

7.2 Data frame dfNmr

Para la segunda columna del data frame dfNmr utilizamos la función rep() para generar una serie de 100 elementos repitiendo 4 veces cada uno de los elementos 1 a 25

dfNmr[1:100, 2] = rep(x = 1:25, each = 4)
  • paste0("dfNmr[", nrow(dfNmr), " Filas, ", ncol(dfNmr), " Columnas]")
    • dfNmr[100 Filas, 2 Columnas]

Al igual que en el caso anterior, en este punto el data frame dfNmr ya tiene dos columnas

print(dfNmr[1:10,])
summary(dfNmr)
##    V1 V2
## 1   1  1
## 2   2  1
## 3   3  1
## 4   4  1
## 5   5  2
## 6   6  2
## 7   7  2
## 8   8  2
## 9   9  3
## 10 10  3
##        V1               V2    
##  Min.   :  1.00   Min.   : 1  
##  1st Qu.: 25.75   1st Qu.: 7  
##  Median : 50.50   Median :13  
##  Mean   : 50.50   Mean   :13  
##  3rd Qu.: 75.25   3rd Qu.:19  
##  Max.   :100.00   Max.   :25

8 Cambio de los nombres de las columnas

En caso de no asignar nombres a las columnas, se asingan de forma automática.

La función colnamespermite:

  • Conocer los nombres de las columnas del data frame
  • Asignar nuevos nombres a las columnas del data frame

8.1 Data frame dfLtr

  • Nombres actuales de las columnas: colnames(dfLtr) –> V1, V2
  • Asignación de nuevos nombres: colnames(dfLtr) = c("IdL", "Ltr") –>

8.2 Data frame dfNmb

  • Nombres actuales de las columnas: colnames(dfNmr) –> IdL, Ltr
  • Asignación de nuevos nombres: colnames(dfNmr) = c("IdN, "Nmr") –> `r
  • Asignación de nuevos nombres: colnames(dfLtr) = c("IdL", "Ltr") –> colnames(dfNmr) = c(“IdN,” “Nmr”)`
  • Comprobación del cambio de nombres: colnames(dfNmr) –> V1, V2