Documento aquí la lista de alternativas para leer archivos de ancho fijo en R, además de proporcionar algunos puntos de referencia para los que es más rápido.
Mi enfoque preferido es combinar fread
con stringi
; es competitivo como el enfoque más rápido y tiene el beneficio adicional (IMO) de almacenar sus datos como data.table
:
library(data.table)
library(stringi)
col_ends <-
list(beg = c(1, 10, 15, 19, 23, 28, 32, 36,
41, 45, 49, 54, 58),
end = c(9, 14, 18, 22, 27, 31, 35,
40, 44, 48, 53, 57, 61))
data = fread(
"http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for",
header = FALSE, skip = 4L, sep = NULL
)[, lapply(1:(length(col_ends$beg)),
function(ii)
stri_sub(V1, col_ends$beg[ii], col_ends$end[ii]))
][ , paste0("V", c(2, 5, 8, 11)) := NULL]
Tenga en cuenta que fread
elimina automáticamente los espacios en blanco iniciales y finales; a veces, esto no es deseable, en cuyo caso se establece strip.white = FALSE
.
También podríamos haber comenzado con un vector de anchos de columna ww
haciendo:
ww <- c(9, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 4, 4)
nd <- cumsum(ww)
col_ends <-
list(beg = c(1, nd[-length(nd)]+1L),
end = nd)
Y podríamos haber elegido qué columnas excluir de manera más sólida mediante el uso de índices negativos como:
col_ends <-
list(beg = c(1, -10, 15, 19, -23, 28, 32, -36,
41, 45, -49, 54, 58),
end = c(9, 14, 18, 22, 27, 31, 35,
40, 44, 48, 53, 57, 61))
Luego reemplace col_ends$beg[ii]
con abs(col_ends$beg[ii])
y en la siguiente línea:
paste0("V", which(col_ends$beg < 0))
Por último, si desea que los nombres de las columnas también se lean mediante programación, puede limpiar con readLines
:
cols <-
gsub("\\s", "",
sapply(1:(length(col_ends$beg)),
function(ii)
stri_sub(readLines(URL, n = 4L)[4L],
col_ends$beg[ii]+1L,
col_ends$end[ii]+1L)))
cols <- cols[cols != ""]
(tenga en cuenta que combinar este paso con fread
requeriría crear una copia de la tabla para eliminar la fila del encabezado y, por lo tanto, sería ineficiente para conjuntos de datos grandes)
read.fwf
a leer datos con formato de ancho fijo.