Saya mendokumentasikan di sini daftar alternatif untuk membaca file dengan lebar tetap di R, serta menyediakan beberapa tolok ukur yang tercepat.
Pendekatan pilihan saya adalah menggabungkan fread
dengan stringi
; itu kompetitif sebagai pendekatan tercepat, dan memiliki manfaat tambahan (IMO) menyimpan data Anda sebagai 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]
Perhatikan bahwa fread
secara otomatis menghapus spasi kosong di depan dan di belakang - terkadang, ini tidak diinginkan, dalam hal ini ditetapkan strip.white = FALSE
.
Kita juga bisa memulai dengan vektor lebar kolom ww
dengan melakukan:
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)
Dan kita bisa memilih kolom mana yang akan dikecualikan lebih kuat dengan menggunakan indeks negatif seperti:
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))
Kemudian ganti col_ends$beg[ii]
dengan abs(col_ends$beg[ii])
dan di baris berikutnya:
paste0("V", which(col_ends$beg < 0))
Terakhir, jika Anda ingin nama kolom juga dibaca secara terprogram, Anda dapat membersihkannya dengan 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 != ""]
(perhatikan bahwa menggabungkan langkah ini dengan fread
akan memerlukan pembuatan salinan tabel untuk menghapus baris header, dan karenanya tidak efisien untuk kumpulan data yang besar)
read.fwf
untuk membaca data berformat lebar tetap.