Ben belge burada R sabit genişlikli dosyaları okuma, hem de en hızlı olduğu için bazı kriterler sağlamak için alternatifler listesi.
Benim tercih yaklaşım birleştirmektir freadile stringi; en hızlı yaklaşım olarak rekabetçidir ve verilerinizi şu şekilde depolamanın ek faydasına (IMO) sahiptir 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]
Not freadbu durumda kümesinde, bazen, bu istenmeyen bir durumdur - otomatik olarak ön ve boşluk arka şeritler strip.white = FALSE.
Şunları wwyaparak da sütun genişlikleri vektörüyle başlayabilirdik :
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)
Aşağıdakiler gibi negatif endeksler kullanarak hangi sütunları daha sağlam bir şekilde hariç tutacağımızı seçebilirdik:
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))
Ardından sonraki satırda ve col_ends$beg[ii]ile değiştirin abs(col_ends$beg[ii]):
paste0("V", which(col_ends$beg < 0))
Son olarak, sütun adlarının da programlı olarak okunmasını istiyorsanız, şunları temizleyebilirsiniz 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 != ""]
(Bu adımı birleştirmenin fread, başlık satırını kaldırmak için tablonun bir kopyasını oluşturmayı gerektireceğini ve bu nedenle büyük veri kümeleri için verimsiz olacağını unutmayın)
read.fwfSabit genişlikte biçimlendirilmiş verileri okumak için bir göz atın .