मैं here दस्तावेज आर में निश्चित चौड़ाई वाली फ़ाइलों को पढ़ने के विकल्पों की सूची के साथ-साथ कुछ मानक प्रदान करता हूं जिसके लिए सबसे तेज़ है।
मेरा पसंदीदा दृष्टिकोण 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 = "\n"
)[, 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]
# V1 V3 V4 V6 V7 V9 V10 V12 V13
# 1: 03JAN1990 23.4 -0.4 25.1 -0.3 26.6 0.0 28.6 0.3
# 2: 10JAN1990 23.4 -0.8 25.2 -0.3 26.6 0.1 28.6 0.3
# 3: 17JAN1990 24.2 -0.3 25.3 -0.3 26.5 -0.1 28.6 0.3
# 4: 24JAN1990 24.4 -0.5 25.5 -0.4 26.5 -0.1 28.4 0.2
# 5: 31JAN1990 25.1 -0.2 25.8 -0.2 26.7 0.1 28.4 0.2
# ---
# 1365: 24FEB2016 27.1 0.9 28.4 1.8 29.0 2.1 29.5 1.4
# 1366: 02MAR2016 27.3 1.0 28.6 1.8 28.9 1.9 29.5 1.4
# 1367: 09MAR2016 27.7 1.2 28.6 1.6 28.9 1.8 29.6 1.5
# 1368: 16MAR2016 27.5 1.0 28.8 1.7 28.9 1.7 29.6 1.4
# 1369: 23MAR2016 27.2 0.9 28.6 1.4 28.8 1.5 29.5 1.2
ध्यान दें कि fread
स्वचालित रूप से प्रमुख और रिक्त स्थान को अनुगामी स्ट्रिप्स - कभी कभी, यह अवांछनीय है, किस मामले में strip.white = FALSE
सेट करें।
यह भी ध्यान दें कि मैंने किसी भी लाइन-लाइन विभाजन को रोकने के लिए sep = "\n"
चुना है। यदि this issue लागू किया गया है, तो हमारे पास एक और अधिक मजबूत विकल्प होगा।
हम यह भी करने से स्तंभ चौड़ाई 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' पर एक नज़र डालें एड चौड़ाई स्वरूपित डेटा। –
मुझे लगता है कि प्रत्येक पंक्ति को संसाधित करना बेहतर विचार है। यह '-' अक्षर के साथ मिश्रण करता है। – Fernando
वैकल्पिक रूप से, आप श्वेत-स्थान कह सकते हैं या - केवल एक वर्ण है, इसलिए पहले टैब के साथ एक स्पेस की सभी कई घटनाओं को प्रतिस्थापित करें, फिर सभी टैब-पृथक प्रविष्टि के ऑन-या व्हाइट स्पेस को विभाजित करें। – GitaarLAB