data.table
डेटा संग्रहीत करने के लिए सूची कॉलम का उपयोग करना
खोज…
परिचय
list
वर्ग से संबंधित स्तंभ वैक्टर का समर्थन करता है।
टिप्पणियों
यदि यह अजीब लगता है कि हम कोड में उस शब्द का उपयोग किए बिना सूचियों के बारे में बात कर रहे हैं, तो ध्यान दें कि .()
list()
लिए एक उपनाम है list()
जब DT[...]
अंदर उपयोग किया जाता है DT[...]
कॉल।
कई संबंधित फाइलों में पढ़ना
मान लीजिए कि हम समान-स्वरूपित फ़ाइलों का एक गुच्छा पढ़ना और स्टैक करना चाहते हैं। त्वरित समाधान है:
rbindlist(lapply(list.files(patt="csv$"), fread), id=TRUE)
हम कुछ कारणों से इससे संतुष्ट नहीं हो सकते हैं:
- यह जब साथ पढ़ने त्रुटियों में आ सकते हैं
fread
या जब साथ stackingrbindlist
वजह से असंगत या गाड़ी डेटा स्वरूपण करने के लिए। - हम प्रत्येक फ़ाइल के लिए मेटाडेटा का ट्रैक रखना चाहते हैं, फ़ाइल नाम से या शायद (कुछ सारणीबद्ध नहीं) फ़ाइलों के भीतर कुछ हेडर पंक्तियों से पकड़ा जा सकता है।
इसे संभालने का एक तरीका "फाइल टेबल" बनाना है और प्रत्येक फाइल की सामग्री को सूची से कॉलम प्रविष्टि के रूप में जुड़ा हुआ है।
उदाहरण डेटा
नीचे दिए गए उदाहरण डेटा बनाने से पहले, सुनिश्चित करें कि आप एक खाली फ़ोल्डर में हैं जिसे आप लिख सकते हैं। यदि आपको फ़ोल्डर बदलने की आवश्यकता है, तो getwd()
पढ़ें और ?setwd
।
# example data
set.seed(1)
for (i in 1:3)
fwrite(data.table(id = 1:2, v = sample(letters, 2)), file = sprintf("file201%s.csv", i))
फ़ाइलों और फ़ाइल मेटाडेटा को पहचानें
यह हिस्सा काफी सीधा है:
# First, identify the files you want:
fileDT = data.table(fn = list.files(pattern="csv$"))
# Next, optionally parse the names for metadata using regex:
fileDT[, year := type.convert(sub(".*([0-9]{4}).*", "\\1", fn))]
# Finally construct a string file-ID column:
fileDT[, id := as.character(.I)]
# fn year id
# 1: file2011.csv 2011 1
# 2: file2012.csv 2012 2
# 3: file2013.csv 2013 3
फाइलों में पढ़ें
सूची स्तंभ के रूप में फ़ाइलों में पढ़ें:
fileDT[, contents := .(lapply(fn, fread))]
# fn year id contents
# 1: file2011.csv 2011 1 <data.table>
# 2: file2012.csv 2012 2 <data.table>
# 3: file2013.csv 2013 3 <data.table>
अगर वहाँ फ़ाइलों में से एक को पढ़ने में कोई समस्या है या आपके पास करने के लिए तर्क को बदलने की जरूरत fread
फ़ाइल के गुणों पर निर्भर करता है, तो इस चरण को आसानी से बढ़ाया जा सकता है, की तरह लग रही:
fileDT[, contents := {
cat(fn, "\n")
dat = if (year %in% 2011:2012){
fread(fn, some_args)
} else {
fread(fn)
}
.(.(dat))
}, by=fn]
सीएसवी और इसी तरह की फाइलों में पढ़ने के विकल्पों पर जानकारी के लिए, देखें ?fread
ढेर डेटा
यहां से, हम डेटा को स्टैक करना चाहते हैं:
fileDT[, rbindlist(setNames(contents, id), idcol="file_id")]
# file_id id v
# 1: 1 1 g
# 2: 1 2 j
# 3: 2 1 o
# 4: 2 2 w
# 5: 3 1 f
# 6: 3 2 w
यदि स्टैकिंग में कुछ समस्या होती है (जैसे कॉलम नाम या कक्षाएं मेल नहीं fileDT
हैं), तो हम fileDT
में अलग-अलग तालिकाओं में वापस जा सकते हैं, जहां समस्या उत्पन्न हुई। उदाहरण के लिए,
fileDT[id == "2", contents[[1]]]
# id v
# 1: 1 o
# 2: 2 w
एक्सटेंशन
यदि फ़ाइलें आपके वर्तमान कार्यशील dir में नहीं हैं, तो उपयोग करें
my_dir = "whatever"
fileDT = data.table(fn = list.files(my_dir, pattern="*.csv"))
# and when reading
fileDT[, contents := .(lapply(fn, function(n) fread(file.path(my_dir, n))))]