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
- ejercicio 1
- cargar estos datos
- comprobar si alguna variable influye en "proportion"
- 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
- 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"
- 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
- 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"
- 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")]))
- solución 1 (Bash)
- 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
- ejercicio 1
- cargar estos datos
- relacionar
pesoy edad al destete
- ejercicio 2
- cargar estos datos
- relacionar
pesoy día de la semana de nacimiento
1.1.3 ancho fijo
read.fwf
- 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"
- 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
- 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) - 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)) - 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
- ejercicio 1
- Cargar empleo-situacion.xml.
- Calcular el tiempo que ha trabajado cada individuo (como en )
- ejercicio 2
- Cargar playas.xml (fichero obtenido de http://transparencia.gijon.es/set/medio-ambiente/CalidadAgua, http://transparencia.gijon.es/set/medio-ambiente/CalidadAgua)
- Informar de la calidad del agua.
- ejercicio 3
- Importar como lista de R la página Titulares del dUO (
htmlParseyxmlToList) - Navegar la lista e intentar obtener la lista de novedades (de actos, por ejemplo)
- Intentar lo mismo accediendo al enlace RSS
- Importar como lista de R la página Titulares del dUO (
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
- 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
- características
- BSON: JSON binarizado
- cualquier contenido (p.ej. vídeos)
- optimizada; sólo disponible para arquitecturas i386 y amd64
- 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
mtcarsestuviera 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…