Lectura y escritura de tablas Org con R
Lectura y escritura de tablas Org con R
El paquete orgutils
de R permite leer y escribir tablas de datos en formato Org, un dialecto especial de emacs. La función toOrg()
transforma tablas y fechas a formato Org, mientras que readOrg
lee cualquier tabla de un fichero Org.
Creamos una tabla sencilla que sirva de ejemplo.
library(orgutils) data <- iris[1L:5L,c(1L,2L,5L)] data$time <- Sys.time() data
Sepal.Length Sepal.Width Species time 1 5.1 3.5 setosa 2023-03-09 07:41:09 2 4.9 3.0 setosa 2023-03-09 07:41:09 3 4.7 3.2 setosa 2023-03-09 07:41:09 4 4.6 3.1 setosa 2023-03-09 07:41:09 5 5.0 3.6 setosa 2023-03-09 07:41:09
Si aparecen fechas, hay que cambiarlas previamente a carácter. En general, es mejor transformar los datos a carácter antes de llamar a toOrg
.
aa <- data aa$time <- as.character(aa$time) toOrg(aa)
| Sepal.Length | Sepal.Width | Species | time | |--------------+-------------+---------+---------------------| | 5.1 | 3.5 | setosa | 2023-03-09 07:41:09 | | 4.9 | 3 | setosa | 2023-03-09 07:41:09 | | 4.7 | 3.2 | setosa | 2023-03-09 07:41:09 | | 4.6 | 3.1 | setosa | 2023-03-09 07:41:09 | | 5 | 3.6 | setosa | 2023-03-09 07:41:09 |
Escribimos estos resultados en un fichero temporal.
filename <- tempfile(fileext=".org") cat(toOrg(aa),file=filename,sep="\n")
Si disponemos de un fichero Org con diferentes tablas, se pueden leer de forma separada con la opción table.name
. Como en este caso el fichero es una única tabla, leemos directamente el fichero. Los datos de tiempo han de transformarse de nuevo.
bb <- readOrg(filename) bb$time <- as.POSIXct(bb$time,"%Y-%m-%d %H:%M:%S") bb
Sepal.Length Sepal.Width Species time 1 5.1 3.5 setosa 2023-03-09 07:41:09 2 4.9 3.0 setosa 2023-03-09 07:41:09 3 4.7 3.2 setosa 2023-03-09 07:41:09 4 4.6 3.1 setosa 2023-03-09 07:41:09 5 5.0 3.6 setosa 2023-03-09 07:41:09
Normalmente empleo el formato Org en vez del csv. Es decir, almaceno tablas de datos en formato Org. Si un fichero solo contiene una tabla de estas características, una forma más eficiente de leerlo consiste en utilizar fread
del paquete data.table
.
library(data.table) nms <- names(fread(filename,sep="|",nrows=1L,header=TRUE,fill=TRUE)) # header dt <- fread(filename,skip=2L,sep="|",fill=TRUE) # data setattr(dt,"names",nms) # Nombres de las columnas set(dt,i=NULL,j=c(1L,length(dt)),value=NULL) # Eliminamos primera y última columna dt
Sepal.Length Sepal.Width Species time 1: 5.1 3.5 setosa 2023-03-09 07:41:09 2: 4.9 3.0 setosa 2023-03-09 07:41:09 3: 4.7 3.2 setosa 2023-03-09 07:41:09 4: 4.6 3.1 setosa 2023-03-09 07:41:09 5: 5.0 3.6 setosa 2023-03-09 07:41:09
Por último, reproducimos el ejemplo de la viñeta de orgutils
. Crea un fichero Org con diferentes tablas cada una de ellas con su nombre.
text <- " #+TITLE: My table file There is text. * Section 1 #+name: table1 | A | B | C | |---+---+---| | 1 | 2 | 3 | | 4 | 5 | 6 | And more text. ** Subsection 1.1 #+name: table2 | D | E | F | |---+---+---| | 1 | 2 | 3 | | 4 | 5 | X | And more text. #+name: table3 | G | H | I | |---+---+---| | 5 | 7 | 9 | | 6 | 8 | 0 | And more text. " filename <- tempfile(fileext=".org") cat(text,file=filename)
Si deseamos leer una tabla en concreto, basta con utilizar la opción table.name
.
readOrg(filename, table.name = "table2")
D E F 1 1 2 3 2 4 5 X
Una forma sencilla de identificar qué tablas aparecen en un fichero Org consiste en leer las líneas y rebuscar los nombres que aparecen.
txt <- readLines(filename) pos <- grep("^#\\+name: ",txt, ignore.case = TRUE) txt[pos]
[1] "#+name: table1" "#+name: table2" "#+name: table3"