여기 에 R에서 고정 너비 파일을 읽기위한 대안 목록을 문서화 하고 가장 빠른 벤치 마크를 제공합니다.
내가 선호하는 접근 방식은 다음과 결합하는 것 fread
입니다 stringi
. 가장 빠른 접근 방식으로 경쟁력이 있으며 데이터를 다음과 같이 저장하는 추가 이점 (IMO)이 있습니다 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]
fread
선행 및 후행 공백 을 자동으로 제거합니다. 때로는 바람직하지 않은 경우도 strip.white = FALSE
있습니다.
다음 ww
을 수행 하여 열 너비 벡터로 시작할 수도 있습니다 .
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)
그리고 다음과 같은 음수 인덱스를 사용하여 더 강력하게 제외 할 열을 선택할 수 있습니다.
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))
그런 다음 교체 col_ends$beg[ii]
로 abs(col_ends$beg[ii])
하고 다음 줄에 :
paste0("V", which(col_ends$beg < 0))
마지막으로 열 이름도 프로그래밍 방식으로 읽으려면 다음을 사용하여 정리할 수 있습니다 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 != ""]
(이 단계를와 결합 fread
하면 헤더 행을 제거하기 위해 테이블 사본을 만들어야하므로 대용량 데이터 세트의 경우 비효율적입니다.)
read.fwf
고정 너비 형식의 데이터를 읽으려면 살펴보십시오 .