2013-01-17 18 views
71

मैं लोड करने के लिए कोशिश कर रहा हूँ इस बदसूरत स्वरूपित मेरी आर सत्र में डेटा-सेट: http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.forपढ़ें निश्चित चौड़ाई पाठ फ़ाइल

Weekly SST data starts week centered on 3Jan1990 

Nino1+2  Nino3  Nino34  Nino4 
Week   SST SSTA  SST SSTA  SST SSTA  SST SSTA 
03JAN1990  23.4-0.4  25.1-0.3  26.6 0.0  28.6 0.3 
10JAN1990  23.4-0.8  25.2-0.3  26.6 0.1  28.6 0.3 
17JAN1990  24.2-0.3  25.3-0.3  26.5-0.1  28.6 0.3 

अब तक, मैं के साथ लाइनों को पढ़ सकते

x = readLines(path) 

लेकिन फ़ाइल 'व्हाइट स्पेस' को अलग-अलग के रूप में '-' के साथ मिश्रित करती है, और मैं रेगेक्स विशेषज्ञ नहीं हूं। मैं इसे एक अच्छे और साफ आर डेटा फ्रेम में बदलने पर किसी भी मदद की सराहना करता हूं। धन्यवाद!

+5

और पढ़ने के लिए पढ़ने के लिए 'read.fwf' पर एक नज़र डालें एड चौड़ाई स्वरूपित डेटा। –

+0

मुझे लगता है कि प्रत्येक पंक्ति को संसाधित करना बेहतर विचार है। यह '-' अक्षर के साथ मिश्रण करता है। – Fernando

+0

वैकल्पिक रूप से, आप श्वेत-स्थान कह सकते हैं या - केवल एक वर्ण है, इसलिए पहले टैब के साथ एक स्पेस की सभी कई घटनाओं को प्रतिस्थापित करें, फिर सभी टैब-पृथक प्रविष्टि के ऑन-या व्हाइट स्पेस को विभाजित करें। – GitaarLAB

उत्तर

157

यह एक निश्चित चौड़ाई फ़ाइल है। इसे पढ़ने के लिए read.fwf() का उपयोग करें:

x <- read.fwf(
    file=url("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for"), 
    skip=4, 
    widths=c(12, 7, 4, 9, 4, 9, 4, 9, 4)) 

head(x) 

      V1 V2 V3 V4 V5 V6 V7 V8 V9 
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 
6 07FEB1990 25.8 0.2 26.1 -0.1 26.8 0.1 28.4 0.3 

अद्यतन

पैकेज readr (जारी की अप्रैल, 2015) एक सरल और तेजी से विकल्प प्रदान करता है।

library(readr) 

x <- read_fwf(
    file="http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for", 
    skip=4, 
    fwf_widths(c(12, 7, 4, 9, 4, 9, 4, 9, 4))) 

स्पीड तुलना: readr::read_fwf() तेजी utils::read.fwf() से था ~ 2x।

+7

@Andrie आप कैसे जानते थे कि चौड़ाई और स्किप्स क्या थे? – Koba

+11

@ कोबा: मैंने एक पंक्ति संपादक में एक पंक्ति संपादक की प्रतिलिपि बनाई और चिपकाया जिसमें कॉलम गिनती थी और मैंने मैन्युअल रूप से प्रत्येक कॉलम के लिए चौड़ाई की गणना की (जब आवश्यक हो तो व्हाइटस्पेस सहित)। इसके अलावा आप यह भी बता सकते हैं कि कच्चे डेटा तक पहुंचने से पहले आपको 4 पूरी लाइनों को छोड़ना होगा। – rayryeng

+5

@ अवांछित व्हाइटस्पेस को छोड़ने के लिए नकारात्मक स्तंभ चौड़ाई के साथ नीचे पैविथ्रा का उत्तर स्वीकार किए गए उत्तर के लिए बेहतर हो सकता है। –

4

मैं आर के बारे में एक बात पता नहीं है, लेकिन मैं एक regex कि इस तरह की लाइनों से मेल खाएगी के साथ आप प्रदान कर सकते हैं:

\s[0-9]{2}[A-Z]{3}[0-9]{4}(\s{5}[0-9]+\.[0-9]+[ -][0-9]+\.[0-9]+){4} 
48

एक और तरीका है चौड़ाई निर्धारित करने के लिए ...

df <- read.fwf(
    file=url("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for"), 
    widths=c(-1, 9, -5, 4, 4, -5, 4, 4, -5, 4, 4, -5, 4, 4), 
    skip=4 
) 

-1 चौड़ाई में तर्क का कहना है एक एक चरित्र स्तंभ अनदेखा किया जाना चाहिए नहीं है, -5 चौड़ाई में तर्क का कहना है एक पांच चरित्र स्तंभ अनदेखा किया जाना चाहिए, वैसे ही ...

रेफरी: https://www.inkling.com/read/r-cookbook-paul-teetor-1st/chapter-4/recipe-4-6

14

सबसे पहले, इस सवाल का सीधे लीक से एक Coursera "डेटा प्राप्त करें और यह साफ" पाठ्यक्रम से है। हालांकि सवाल का एक और हिस्सा है, कठिन हिस्सा फाइल पढ़ रहा है।

उस ने कहा, पाठ्यक्रम ज्यादातर सीखने के लिए है।

मुझे आर की निश्चित चौड़ाई प्रक्रिया से नफरत है। यह धीमी है और चर की बड़ी संख्या के लिए, यह बहुत जल्दी कुछ कॉलम नकारना करने के लिए एक दर्द, आदि

मुझे लगता है कि इसके आसान है कि उपयोग substr() से readLines() उपयोग करने के लिए और फिर अपने चर बनाने के लिए हो जाता है

x <- readLines(con=url("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for")) 

# Skip 4 lines 
x <- x[-(1:4)] 

mydata <- data.frame(var1 = substr(x, 1, 10), 
        var2 = substr(x, 16, 19), 
        var3 = substr(x, 20, 23), 
        var4 = substr(x, 29, 32) # and so on and so on 
        ) 
+0

यह दृष्टिकोण मेरे लिए काम किया। दो अतिरिक्त टिप्स: 1) आप मायादाटा को केवल वही डेटा होने के लिए परिभाषित कर सकते हैं जो आपको चाहिए। तो यह 'mydata <- data.frame (var4 = substr (x, 29,32)) के रूप में सरल हो सकता है, यदि आपको केवल डेटा के चौथे कॉलम की आवश्यकता है। साथ ही, विंडोज उपयोगकर्ताओं के लिए, टेक्स्टफैक्स प्लगइन के साथ नोटपैड ++ आपको एक सादा और सरल, गिनती वर्ण शासक मिलेगा ताकि आप यह समझ सकें कि शुरुआत में क्या रखा जाए और 'substr' में मानों को रोकें। नोट, हालांकि, स्टॉप मान उस अंतिम वर्ण की स्थिति से अधिक है जिसे आप संरक्षित करना चाहते हैं। – globalSchmidt

0

सबसे प्रत्यक्ष तरीका है ऊपर बताए गए read.fwf का उपयोग करना।

ठीक है अगर अंतिम लक्ष्य इसे आर में प्राप्त करना है, तो आप हमेशा इसे स्टार्ट के लिए Excel में पढ़ सकते हैं, कॉलम को दृष्टि से काटने के लिए "टेक्स्ट टू क्लॉमन्स" सुविधा का उपयोग करें, फिर अंतिम फ़ाइल को CSV के रूप में सहेजें । उसके बाद आर

10

में सीएसवी पढ़ें, अब आप हैडली विकम के readr पैकेज में read_fwf() फ़ंक्शन का उपयोग कर सकते हैं।

एक विशाल प्रदर्शन में सुधार की उम्मीद की जा करने के लिए, आधार read.fwf() की तुलना में है।

0

एक आसान विधि है, तो एक वेब ब्राउज़र में नान प्रोग्रामर्स (जो आर के बाहर जाने के लिए तैयार हैं)

  1. ओपन पेज के लिए।
  2. डेटा की पंक्तियों को टेक्स्ट एडिटर में कॉपी और पेस्ट करें। कॉलम हेडर छोड़ दें।
  3. एक स्थान के साथ एकाधिक रिक्त स्थान बदलने के लिए खोज-और-प्रतिस्थापन का उपयोग करें (अंतरिक्ष द्वारा स्थान-स्थान बदलें। जब तक कोई डबल रिक्त स्थान शेष नहीं है तब तक क्लिक करना जारी रखें। केवल सेकंड लेता है)।
  4. एक स्पेस
  5. के साथ डैश (-) को प्रतिस्थापित करने के लिए खोज-और-प्रतिस्थापन का उपयोग करें, अल्पविराम-स्थान द्वारा स्थान को प्रतिस्थापित करने के लिए खोज-और-प्रतिस्थापित करें।

अब आपके पास एक .csv फ़ाइल है जो मानव को पढ़ने के लिए भी आसान है; बचाओ। इसे एक्सेल, आर, या जो कुछ भी लोड करें, और प्रसंस्करण जारी रखें।

5

मैं 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 को हेडर पंक्ति को हटाने के लिए तालिका की एक प्रति बनाने की आवश्यकता होगी, और इस प्रकार बड़े डेटा सेट के लिए अक्षम होगा)

संबंधित मुद्दे