Tôi ghi lại ở đây danh sách các lựa chọn thay thế để đọc các tệp có chiều rộng cố định trong R, cũng như cung cấp một số điểm chuẩn cho tốc độ nhanh nhất.
Cách tiếp cận ưa thích của tôi là kết hợp fread
với stringi
; nó có tính cạnh tranh như là cách tiếp cận nhanh nhất và có thêm lợi ích (IMO) khi lưu trữ dữ liệu của bạn như một 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]
Lưu ý rằng fread
tự động loại bỏ khoảng trắng ở đầu và cuối - đôi khi, điều này là không mong muốn, trong trường hợp đó được đặt strip.white = FALSE
.
Chúng ta cũng có thể bắt đầu với một vectơ chiều rộng cột ww
bằng cách thực hiện:
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)
Và chúng tôi có thể đã chọn những cột nào để loại trừ mạnh mẽ hơn bằng cách sử dụng các chỉ số phủ định như:
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))
Sau đó thay thế col_ends$beg[ii]
bằng abs(col_ends$beg[ii])
và trong dòng tiếp theo:
paste0("V", which(col_ends$beg < 0))
Cuối cùng, nếu bạn muốn tên cột cũng được đọc theo chương trình, bạn có thể xóa bằng 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 != ""]
(lưu ý rằng việc kết hợp bước này với fread
sẽ yêu cầu tạo bản sao của bảng để xóa hàng tiêu đề và do đó sẽ không hiệu quả đối với các tập dữ liệu lớn)
read.fwf
để đọc dữ liệu được định dạng theo chiều rộng cố định.