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 freadcon 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 freadelimina 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 wwhaciendo:
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 freadrequerirí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.fwfa leer datos con formato de ancho fijo.