আমি এখানে দলিল আর-তে নির্দিষ্ট-প্রস্থের ফাইলগুলি পড়ার জন্য বিকল্পগুলির তালিকাটি , পাশাপাশি কিছু মানদণ্ড সরবরাহ করি যার জন্য দ্রুততম।
আমার পছন্দের পদ্ধতির সাথে একত্রিত করা 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]
নোট করুন যে 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
হওয়ার জন্য শিরোনাম সারিটি সরাতে টেবিলের একটি অনুলিপি তৈরি করা প্রয়োজন এবং এটি বড় ডেটা সেটগুলির জন্য অকার্যকর হবে)
read.fwf
নির্দিষ্ট প্রস্থের বিন্যাসিত ডেটা পড়তে একবার দেখুন ।