নির্দিষ্ট প্রস্থের পাঠ্য ফাইলটি পড়ুন


90

আমি আমার আর সেশনে এই কুৎসিত-ফর্ম্যাট ডেটা সেটটি লোড করার চেষ্টা করছি: 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)

তবে ফাইলটি 'সাদা স্পেস' এর সাথে '-' এর সাথে বিভাজক হিসাবে মিশ্রিত হয় এবং আমি কোনও রেজেক্স বিশেষজ্ঞ নই। এটিকে একটি সুন্দর এবং ক্লিন আর ডেটা ফ্রেমে পরিণত করার জন্য আমি যে কোনও সহায়তার প্রশংসা করি। ধন্যবাদ!


4
এবং read.fwfনির্দিষ্ট প্রস্থের বিন্যাসিত ডেটা পড়তে একবার দেখুন ।
পল হিমস্ট্র্রা

4
আমি মনে করি প্রতিটি সারিটি প্রক্রিয়া করার জন্য এটি একটি ভাল ধারণা। এটি '-' এর সাথে '' অক্ষর মিশ্রিত করে।
ফার্নান্দো

বিকল্পভাবে, আপনি সাদা-স্পেস বলতে পারেন বা - কেবল একটি অক্ষর, তাই প্রথমে কোনও জায়গার সমস্ত একাধিক উপস্থিতি একটি ট্যাব অক্ষর দ্বারা প্রতিস্থাপন করুন, তারপরে সমস্ত ট্যাব-বিভক্ত এন্ট্রি অন - বা সাদা স্থানকে বিভক্ত করুন।
গীতার্ল্যাব

স্থির প্রস্থ = কোনও বিভাজক নেই। এর অর্থ "-" একটি বিয়োগ চিহ্ন এবং স্পেসগুলি
বিভাজকও

উত্তর:


183

এটি একটি নির্দিষ্ট প্রস্থের ফাইল। 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(এপ্রিল, ২০১৫ প্রকাশিত) একটি সহজ এবং দ্রুত বিকল্প সরবরাহ করে।

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()2x ডলার দ্রুত ছিল utils::read.fwf ()


8
@ অ্যান্ড্রি আপনি কীভাবে জানলেন যে প্রস্থ এবং এড়িয়ে যাওয়া কী ছিল?
কোবা

12
@ কোবা: আমি একটি লাইনটি অনুলিপি করে একটি পাঠ্য সম্পাদককে কাস্ট করেছিলাম যার একটি কলাম গণনা ছিল এবং আমি প্রতিটি কলামের জন্য প্রস্থগুলি (প্রয়োজনে হোয়াইটস্পেস সহ) ম্যানুয়ালি গণনা করেছি। এছাড়াও আপনি বলতে পারেন যে কাঁচা ডেটাতে যাওয়ার আগে আপনাকে 4 টি সম্পূর্ণ লাইন ছেড়ে যেতে হবে।
রায়রেং

4
অবাঞ্ছিত শ্বেত স্পেস এড়িয়ে যাওয়ার জন্য নেতিবাচক কলামের প্রস্থের সাথে নীচে পবিথ্রার উত্তর গৃহীত উত্তরের জন্য আরও উপযুক্ত হতে পারে।
মারিউস বুটুক

4
টুইট
বিকিউব

4
@ আলা আমি বিশ্বাস readr::fwf_emptyকরি আপনার জন্য প্রস্থকে অনুমান করার চেষ্টা করবে। উদাহরণগুলির জন্য readr::read_fwfব্যবহারগুলি দেখায় readr::fwf_empty
জ্যাক ফিশার

55

প্রস্থ নির্ধারণের আর একটি উপায় ...

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


20

প্রথমে, প্রশ্নটি সরাসরি লিক্সের একটি "কোর্স ডেটা এবং ক্লিন ইট" কোর্স থেকে নেওয়া। প্রশ্নের আরও একটি অংশ থাকা অবস্থায়, শক্ত অংশটি ফাইলটি পড়ছে reading

এই বলেছিল যে কোর্সটি বেশিরভাগ ক্ষেত্রেই শেখার জন্য intended

আমি আর এর নির্দিষ্ট প্রস্থের প্রক্রিয়াটিকে ঘৃণা করি। এটি ধীর এবং প্রচুর পরিমাণে ভেরিয়েবলের জন্য খুব তাড়াতাড়ি নির্দিষ্ট কলামগুলি অস্বীকার করা ইত্যাদি হয়ে যায় a

আমি মনে করি এটি ব্যবহার করা সহজ readLines()এবং তারপরে সেই ব্যবহারটি substr()আপনার ভেরিয়েবলগুলি তৈরি করতে

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
                     )

4
এই পদ্ধতির আমার জন্য কাজ করে। দুটি অতিরিক্ত টিপস: 1) আপনি মাইডাটা কেবলমাত্র আপনার প্রয়োজন ডেটা হিসাবে সংজ্ঞায়িত করতে পারেন। সুতরাং এটি এত সহজ হতে পারে যেমন mydata <- data.frame(var4 = substr(x,29,32))আপনার কেবলমাত্র ডেটা চতুর্থ কলামের প্রয়োজন। এছাড়াও, উইন্ডোজ ব্যবহারকারীদের জন্য, টেক্সটএফএক্স প্লাগইন সহ নোটপ্যাড ++ আপনাকে একটি সরল এবং সাধারণ, গণনাযুক্ত চরিত্রের শাসক হিসাবে গ্রহণ করবে যাতে আপনি কী শুরুতে রাখা উচিত এবং মানগুলি বন্ধ করতে হবে তা নির্ধারণ করতে পারেন substr। দ্রষ্টব্য, তবে আপনি যে স্টপ মানটি সংরক্ষণ করতে চান তার সর্বশেষ অক্ষরের অবস্থানের চেয়ে আরও একটি।
GlobalSchmidt

13

আপনি এখন read_fwf()হ্যাডলি উইকহ্যামের readrপ্যাকেজে ফাংশনটি ব্যবহার করতে পারেন ।

বেসের সাথে তুলনা করে একটি বিশাল পারফরম্যান্স উন্নতি আশা করা যায় read.fwf()


5

আমি এখানে দলিল আর-তে নির্দিষ্ট-প্রস্থের ফাইলগুলি পড়ার জন্য বিকল্পগুলির তালিকাটি , পাশাপাশি কিছু মানদণ্ড সরবরাহ করি যার জন্য দ্রুততম।

আমার পছন্দের পদ্ধতির সাথে একত্রিত করা freadহয় stringi; এটি দ্রুততম পদ্ধতির হিসাবে প্রতিযোগিতামূলক এবং এতে আপনার ডেটা সংরক্ষণ করার অতিরিক্ত বেনিফিট (আইএমও) রয়েছে 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]
#              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


আমরা কলাম প্রস্থের একটি ভেক্টর দিয়ে এটিও শুরু করতে পারতাম 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)

এবং আমরা যেমন কলামগুলি নেতিবাচক সূচকগুলি ব্যবহার করে আরও দৃ rob়তার সাথে বাদ দিতে চাইতাম:

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হওয়ার জন্য শিরোনাম সারিটি সরাতে টেবিলের একটি অনুলিপি তৈরি করা প্রয়োজন এবং এটি বড় ডেটা সেটগুলির জন্য অকার্যকর হবে)


4

আমি আর সম্পর্কে একটি জিনিস জানি না, তবে আমি আপনাকে একটি রেইজেক্স সরবরাহ করতে পারি যা এই জাতীয় লাইনের সাথে মেলে:

\s[0-9]{2}[A-Z]{3}[0-9]{4}(\s{5}[0-9]+\.[0-9]+[ -][0-9]+\.[0-9]+){4}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.