यह सवाल कई साल पुराना है, लेकिन मैं इस पर अड़ गया, जिसका मतलब है कि शायद दूसरे लोग भी करेंगे।
readr
पुस्तकालय / पैकेज इसे करने के लिए कुछ अच्छा विशेषताएं है। उनमें से एक "गड़बड़" कॉलम की व्याख्या करने का एक अच्छा तरीका है, इन जैसे।
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
यह प्रदान करता है
स्रोत: स्थानीय डेटा फ्रेम [४ x १]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
फ़ाइलों में पढ़ते समय एक महत्वपूर्ण बिंदु: आपको या तो पूर्व-प्रक्रिया करनी होती है, जैसे कि ऊपर दी गई टिप्पणी sed
, या आपको पढ़ते समय प्रक्रिया करनी होती है । अक्सर, यदि आप तथ्य के बाद चीजों को ठीक करने की कोशिश करते हैं, तो कुछ खतरनाक धारणाएं बनती हैं, जिन्हें ढूंढना मुश्किल होता है। (यही वजह है कि फ्लैट फाइलें पहली जगह में इतनी बुरी हैं।)
उदाहरण के लिए, अगर मैंने झंडा नहीं लगाया होता, तो मुझे col_types
यह मिल जाता:
> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]
numbers
(chr)
1 800
2 1,800
3 3500
4 6.5
(ध्यान दें कि यह अब chr
(के character
बजाय) है numeric
।)
या, अधिक खतरनाक रूप से, यदि यह काफी लंबा था और अधिकांश प्रारंभिक तत्वों में अल्पविराम नहीं थे:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(ऐसा है कि पिछले कुछ तत्वों की तरह लग रहे :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
तब आपको उस अल्पविराम को पढ़ने में परेशानी होगी!
> tail(read_csv(tmp))
Source: local data frame [6 x 1]
3"
(dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
)।