UP | HOME |

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"