informatica

Table of Contents

1 formatos textuales

1.1 tabulares

1.1.1 campos separados por un delimitador único (dsv)

  • registro = renglón
  • campos separados por coma (csv), punto-y-coma (csv2), tabulador (tsv), tubo "|" (psv)
  • habitualmente llamados CSV todos ellos
read.csv
read.csv2
read.delim
read.delim2
  1. ejercicio 1
    • cargar estos datos
    • comprobar si alguna variable influye en "proportion"
  2. ejercicio 2
    • cargar estos datos
    • crea una variable "nombre.completo" que contenga sólo mayúsculas
    • crea una variable "NombreCompleto" que esté en minúsculas, salvo las iniciales
  3. ejercicio 3
    • cargar estos datos
    • hacer análisis de componentes principales sobre "ce", "altp", "anchp"
    • hallar influencia de "cul" y "edadm" en "ce", "altp" y "anchp"
  4. ejercicio 4
    • cargar estos datos
    • crear variable "familia.de.curso" con los tres primeros caracteres de "CodEspecialidad"
    • hacer una tabla de frecuencias de familias por cada mes
    • hacer análisis de correspondencias con esa tabla
  5. ejercicio 5
    • cargar estos datos
    • calcular la variable "edad" actual
    • crear una tabla con "id", "edad", "sexo", "sit.laboral.ultima", "numero.de.registros"
    • crear una tabla con "id", "edad", "sexo", "sit.laboral.ultima", "numero.de.registros", "tiempo.trabajando" (trabaja si situación=1)
    • relacionar las tres últimas variables con "edad" y "sexo"
  6. ejercicio 6
    • cargar estos datos
    • el segundo campo es el identificador (ID)
    • los campos que contienen ACGT son genotipos
    • hallar las frecuencias de ACGT en total
      • solución 1 (Bash)
        cat genotipos | recode cl..data | cut -d' ' -f7- | tr ' ' '\n' | sort | uniq -c
        
      • solución 2 (cut + R)
        resultados <- sapply (seq (7, 1160007, 10000),
                              function (primeracolumna)
                              {
                               system (paste0 ("cut -d' ' -f ", primeracolumna, "-", primeracolumna+9999, 
                                               " genotipos > genotipos.tmp"))
                               table (c (as.matrix (read.table ("genotipos.tmp"))))
                              })
        resultados <- c (resultados, list ({system ("cut -d' ' -f1170007-1178858 genotipos > genotipos.tmp"); 
                                            table (c (as.matrix (read.table ("genotipos.tmp"))))}))
        ### queda combinar los resultados
        ## opción 1
        n0 <- nA <- nC <- nG <- nT <- nTRUE <- 0
        for (i in 1:118) {
          ## n0 <- n0 + ifelse (is.na (resultados[[i]]["0"]), 0, resultados[[i]]["0"])
          ## n0 <- n0 + if (is.na (resultados[[i]]["0"])) 0 else resultados[[i]]["0"]
          ## if (!is.na (resultados[[i]]["0"])) n0 <- n0 + resultados[[i]]["0"]
          n0    <- sum (n0, resultados[[i]]["0"],    na.rm=TRUE)
          nA    <- sum (n0, resultados[[i]]["A"],    na.rm=TRUE)
          nC    <- sum (n0, resultados[[i]]["C"],    na.rm=TRUE)
          nG    <- sum (n0, resultados[[i]]["G"],    na.rm=TRUE)
          nT    <- sum (n0, resultados[[i]]["T"],    na.rm=TRUE)
          nTRUE <- sum (n0, resultados[[i]]["TRUE"], na.rm=TRUE)
        }
        ## opción 2
        do.call (rbind, lapply (resultados, 
                                function (x) x[c("0","A","C","G","T","TRUE")]))
        
    • hallar las frecuencias de ACGT para cada ID y comprobar si existen tendencias respecto al número ID
      numero.de.renglones <- as.numeric (strsplit (system ("wc -l genotipos", intern=TRUE), " ") [[1]] [1])
      resultados <- lapply (1 : numero.de.renglones,
         function (i)
         { recuentos <- system (paste0 ("head -n", i, " genotipos | tail -n 1 | ",
                                        "recode cl..data | cut -d' ' -f7- | tr ' ' '\n' | sort | uniq -c"),
                                intern = TRUE)
           recuentos <- strsplit (recuentos, " +")  # crea p.ej.: "" "287" "T"
           resultado <- as.numeric (sapply (recuentos, function (x) x[2]))
           names (resultado) <-     sapply (recuentos, function (x) x[3])
           resultado
         })
      resultados <- as.data.frame (do.call (rbind, resultados))
      resultados$id <- as.numeric (system ("cut -d' ' -f2 genotipos", intern=TRUE))
      

1.1.2 campos separados por espacio

read.table
  1. ejercicio 1
  2. ejercicio 2
    • cargar estos datos
    • relacionar peso y día de la semana de nacimiento

1.1.3 ancho fijo

read.fwf
  1. ejercicio 1
    • INE.es -> productos y servicios -> información estadística -> ficheros de microdatos
    • encuesta de gasto turístico -> macrodatos de turistas -> ( [diseño de registro] y [fichero de microdatos julio 2018] )
    • describir "gasto total" por "país"
  2. ejercicio 2
    • INE.es -> productos y servicios -> información estadística -> ficheros de microdatos
    • censos de población -> ( [diseño de registro] y [fichero de macrodatos] )
    • hallar las cinco provincias con mayor (y las cinco con menor) número medio de hijos por familia y las cinco con mayor (y menor) porcentaje de familias numerosas

1.2 ramificados árboles grafos

1.2.1 sex sexp s-expresiones

  1. p-lista

    El nombre viene de «lista de propiedades».

    (nombre Fulano edad 44 aficiones (leer cantar viajar) peso 88)
    

    Equivaldría a la expresión de R:

    list (nombre="Fulano", edad=44, aficiones=c("leer","cantar","viajar"), peso=88)
    
  2. a-lista

    El nombre viene de «lista de asociaciones». Su uso es similar al de las p-listas.

    ((nombre Fulano) (edad 44) (aficiones leer cantar viajar) (peso 88))
    

    Con pretty-print:

    ((nombre Fulano)
      (edad 44)
      (aficiones leer 
                 cantar 
                 viajar)
      (peso 88))
    
  3. pueden expresar programas

    La siguiente expresión en R:

    (sqrt(30*pi) - 1) / (3 + 8 * log(a/b) / (1 + 2 + 3 + 4 + 5 + 6))
    

    se expresaría así, por ejemplo:

    (/ (- (sqrt (* 30 pi)))
       (/ (+ 3 8 (log (/ a b))) 
          (+ 1 2 3 4 5 6)))
    

    Las siguientes instrucciones de control en R:

    for (i in 0:9)
      if (i %% 2)
        print (paste (i, "es impar"))
      else print (paste (i, "es par"))
    

    se expresarían así, por ejemplo:

    (dotimes (i 10)
        (if (oddp i)
            (print (list i 'es 'impar))
            (print (list i 'es 'par))))
    

    En R se puede obtener el árbol asociado a un programa, pero es más complejo:

    e <- expression ( (2+3)/sqrt(5) )
    as.list(e[[1]])
    as.list(e[[1]][[2]])
    as.list(e[[1]][[2]][[2]])
    

    Nótese que el operador paréntesis introduce un nivel adicional. Otro ejemplo con instrucción de control:

    e <- expression (for (i in 1:10) print (i**2))
    as.list (e[[1]])
    as.list (e[[1]][[3]])
    as.list (e[[1]][[4]][[2]])
    

1.2.2 xml

  • ejemplo de árbol
    <individuo>
      <nombre>Fulano</nombre>
      <edad>44</edad>
      <aficiones>
        <aficion>leer</aficion>
        <aficion>cantar</aficion>
        <aficion>viajar</aficion>
      </aficiones>
      <peso>88</peso>
    </individuo>
    
  • en R
    library (XML)
    xmlParse("individuo.xml") -> x
    xmlToList (x) -> l
    
  1. ejercicio 1
  2. ejercicio 2
  3. ejercicio 3
    • Importar como lista de R la página Titulares del dUO (htmlParse y xmlToList)
    • Navegar la lista e intentar obtener la lista de novedades (de actos, por ejemplo)
    • Intentar lo mismo accediendo al enlace RSS

1.2.3 json

  • ejemplo de árbol
{
  nombre: "Fulano",
  edad: 44,
  aficiones: ["leer", "cantar", "viajar"],
  peso: 88
}

En R:

### https://docs.mongodb.com/manual/tutorial/query-documents/
## db.inventory.insertMany([
##     { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
##     { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
##     { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
##     { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
##     { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
##     ]);
d <- list (
    list (item = "journal",  qty =  25, size = list (s = 320,              uom = "cc"), status = "A" ),
    list (item = "notebook", qty =  50, size = list (h = 8.5,   w = 11,    uom = "in"), status = "A" ),
    list (item = "paper",    qty = 100, size = list (h = 8.5,   w = 11,    uom = "in"), status = "D" ),
    list (item = "planner",  qty =  75, size = list (h = 22.85, w = 30,    uom = "cm"), status = "D" ),
    list (item = "postcard", qty =  45, size = list (h = 10,    w = 15.25, uom = "cm"), status = "A" )
)
library (jsonlite)
j  <- toJSON (d)                        # trasformar a JSON
cat (j, file="/tmp/ejemplo.json")       # guardar en fichero
dj <- fromJSON (j)                      # trasformar de JSON a dataframe
dim (dj)                                # ojo: dataframes anidados y con listas
dim (flatten (dj))                      # trasformar a dataframe normal
  1. ejercicio 1
    • Descargar los datos de trayectos de buses de Gijón (también aquí y en Bellman)
    • Cargarlos en R
    • Hallar las longitudes de los trayectos de cada línea
    • Guardar los resultados como un fichero JSON

2 formatos binarios

2.1 tabulares SQL

2.1.1 lenguaje SQL

Crear:

create table tablavacas (id integer, peso double, nombre text);
insert into tablavacas (123290,295,'ESTRELLA');

Lo habitual es importar desde fuera:

mysqlimport -u usuario -p --delete --local --fields-terminated-by=';' test vacas.csv

Consultas:

select * from tablavacas;
select id,peso/edad from tablavacas;
select id,peso/edad as crecimiento from tablavacas;
select * where peso > 10 and edad < 500;
select id,peso/edad as crecimiento from tablavacas having crecimiento > 1;

Comparando cadenas:

  • % representa cero o algún carácter
  • _ representa exactamente un carácter cualquiera

Agregación:

select avg(peso) as pesomedio from tablavacas group by genotipo;

Otros agregadores: count(), min(), max(), var_samp(), stddev_samp() Por ejemplo:

select genotipo,count(*) from tablavacas group by genotipo;
select sexo,genotipo,count(*) from tablavacas group by sexo,genotipo;
select sexo,count(*),avg(peso) as media,stddev_samp(peso) as dt
  from tablavacas group by genotipo;

Juntar varias tablas, teniendo una columna idvaca de enlace:

select facilidadparto from partos inner join tablavacas using(idvaca);

Modificar:

update tablavacas set peso=198,alzada=150 where id=123123;
delete from tablavacas where id=123123;
drop table tablavacas
drop database aseava;

2.1.2 PostgreSQL

  • características técnicas avanzadas

2.1.3 MySQL MariaDB

  • muy rápida (es la M de LAMP: Linux + Apache + MySQL + Perl o PHP)

2.1.4 SQLite

  • muy cómoda
  • extendidísima (Android, Firefox…)
apt install r-cran-rsqlite

2.2 ramificados NoSQL

2.2.1 MongoDB

  1. características
    • BSON: JSON binarizado
    • cualquier contenido (p.ej. vídeos)
    • optimizada; sólo disponible para arquitecturas i386 y amd64
  2. ejemplo

    Instalación en Debian, Ubuntu, etcétera:

    sudo apt install mongodb
    

    Importaremos los datos de R mtcars, suponiendo que han sido exportados a un fichero de texto CSV:

    mongoimport --file mtcars.csv --type csv --headerline
    

    En versiones antiguas, hay que añadir una opción --collection, por ejemplo:

    mongoimport --file mtcars.csv --type csv --headerline --collection mtcars
    

    Si mtcars estuviera en formato JSON, usado por omisión por MongoDB:

    mongoimport --file mtcars.json
    

    Las consultas pueden hacerse directamente desde el cliente de MongoDB:

    mongo
    > show collections
    > db.mtcars.find({am: 0}).count()
    

3 otros formatos

3.1 pisa

4 redes

  • capas: portadora, ethernet, IP, TCP/UDP, HTTP/FTP/WedDAV…

Author: Carleos Artime

Created: 2018-10-15 lun 19:50

Emacs 25.1.1 (Org mode 8.2.10)

Validate