केवल चयनित कॉलम पढ़ें


134

क्या कोई मुझे बता सकता है कि नीचे दिए गए डेटा के प्रत्येक वर्ष के लिए केवल पहले 6 महीने (7 कॉलम) कैसे पढ़ें, उदाहरण के लिए उपयोग करके read.table()?

Year   Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec   
2009   -41  -27  -25  -31  -31  -39  -25  -15  -30  -27  -21  -25
2010   -41  -27  -25  -31  -31  -39  -25  -15  -30  -27  -21  -25 
2011   -21  -27   -2   -6  -10  -32  -13  -12  -27  -30  -38  -29

5
यह R में एक फ़ाइल से केवल चुनिंदा कॉलम पढ़ने के तरीकों के डुप्लिकेट है ? , डिर्क ने अपने उत्तर मेंNULL कॉलम क्लास के रूप में उल्लेख किया है
मारेक


2
@CiroSantilli 包子 露 ill ill 法轮功 ... ज़रूर लेकिन ... मैंने पहले पूछा?
StarCub

मैं एक बेहतर / बदतर संबंध नहीं थोप रहा था। इसके अलावा कोई क्रॉस साइट डुप्लिकेट नहीं हैं, असंगत स्टैक एक्सचेंज नेटवर्क उन्हें अनुमति देता है, जब तक कि आप स्वयं पोस्ट पार नहीं करते हैं :-)
सिरो सेंटिल्ली Sant site site site '15

जवाबों:


157

मान लें कि डेटा फ़ाइल में है data.txt, आप कॉलम को छोड़ने के colClassesतर्क का उपयोग कर सकते read.table()हैं। यहां पहले 7 कॉलम में डेटा हैं "integer"और हम शेष 6 कॉलम को "NULL"यह इंगित करने के लिए सेट करते हैं कि उन्हें छोड़ दिया जाना चाहिए

> read.table("data.txt", colClasses = c(rep("integer", 7), rep("NULL", 6)), 
+            header = TRUE)
  Year Jan Feb Mar Apr May Jun
1 2009 -41 -27 -25 -31 -31 -39
2 2010 -41 -27 -25 -31 -31 -39
3 2011 -21 -27  -2  -6 -10 -32

वास्तविक प्रकार के आंकड़ों के आधार पर "integer"विस्तृत प्रकारों में से एक में बदलें ?read.table

data.txt इस तरह दिखता है:

$ cat data.txt 
"Year" "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
2009 -41 -27 -25 -31 -31 -39 -25 -15 -30 -27 -21 -25
2010 -41 -27 -25 -31 -31 -39 -25 -15 -30 -27 -21 -25
2011 -21 -27 -2 -6 -10 -32 -13 -12 -27 -30 -38 -29

और उपयोग करके बनाया गया था

write.table(dat, file = "data.txt", row.names = FALSE)

कहाँ datहै

dat <- structure(list(Year = 2009:2011, Jan = c(-41L, -41L, -21L), Feb = c(-27L, 
-27L, -27L), Mar = c(-25L, -25L, -2L), Apr = c(-31L, -31L, -6L
), May = c(-31L, -31L, -10L), Jun = c(-39L, -39L, -32L), Jul = c(-25L, 
-25L, -13L), Aug = c(-15L, -15L, -12L), Sep = c(-30L, -30L, -27L
), Oct = c(-27L, -27L, -30L), Nov = c(-21L, -21L, -38L), Dec = c(-25L, 
-25L, -29L)), .Names = c("Year", "Jan", "Feb", "Mar", "Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = "data.frame",
row.names = c(NA, -3L))

यदि स्तंभों की संख्या पहले से ज्ञात नहीं है, तो उपयोगिता फ़ंक्शन count.fieldsफ़ाइल के माध्यम से पढ़ेगा और प्रत्येक पंक्ति में फ़ील्ड की संख्या की गणना करेगा।

## returns a vector equal to the number of lines in the file
count.fields("data.txt", sep = "\t")
## returns the maximum to set colClasses
max(count.fields("data.txt", sep = "\t"))

1
@Benjamin तर्क का उपयोग करके फ़ाइल से लाइनों के पहले जोड़े को पढ़ें nrows। फिर यह पता लगाने के लिए कि कितने स्तंभों का उपयोग कर रहे हैं ncol(), या फिर आप स्तंभों की संख्या को पढ़ना / अनदेखा करना चाहते हैं। फिर इस जानकारी का उपयोग करके पूरी फ़ाइल पढ़ें।
गैविन सिम्पसन

1
?? यदि आप स्तंभों की संख्या को नहीं जानते हैं तो आप इसे कैसे पढ़ सकते हैं, इसके बारे में थोड़ा पढ़े बिना ही यह निर्धारित कर सकते हैं कि कितने हैं?
गेविन सिम्पसन

1
@BlueMagister संपादित करने और उल्लेख करने के लिए धन्यवाद, count.fields()जो मैंने टिप्पणियों में सुझाई गई प्रक्रिया को स्वचालित करता है।
गाविन सिम्पसन

1
@ LéoLéopoldHertz and नहीं, और मुझे यकीन नहीं है कि यह पंक्ति डेटा फ्रेम के रूप में पंक्ति वर्गों के लिए कैसे काम करेगी , जबकि प्रत्येक स्तंभ एक अलग प्रकार का हो सकता है, प्रत्येक पंक्ति परिभाषा के अनुसार और परिणामस्वरूप, अप्रतिबंधित है। आपको आयात पर रिक्त पंक्तियों आदि को फ़िल्टर करना होगा।
गेविन सिम्पसन

1
@rmf आप count.fields()एक टेक्स्ट कनेक्शन पास कर सकते हैं , इसलिए, पंक्तियों के कुछ सबसेट का उपयोग करके txt <- readLines(....)पढ़ें con <- textConnection(txt), फिर लाइनों में रीड के लिए एक कनेक्शन बनाएं , फिर करें count.fields(txt)। का उपयोग सुनिश्चित करें skipमें count.fields()शीर्ष लेख पंक्ति को छोड़ने के लिए अगर वहाँ एक है; आप का उपयोग कर फ़ाइल में पंक्तियों को छोड़ नहीं सकते readLines()
गैविन सिम्पसन

82

किसी डेटासेट से कॉलम का एक विशिष्ट सेट पढ़ने के लिए, कई अन्य विकल्प हैं:

1) freadसेdata.table -package:

आप के साथ वांछित कॉलम निर्दिष्ट कर सकते हैं selectसे पैरामीटर freadसेdata.table पैकेज । आप स्तंभ नाम या स्तंभ संख्या के वेक्टर के साथ कॉलम निर्दिष्ट कर सकते हैं।

उदाहरण के लिए डाटासेट:

library(data.table)
dat <- fread("data.txt", select = c("Year","Jan","Feb","Mar","Apr","May","Jun"))
dat <- fread("data.txt", select = c(1:7))

वैकल्पिक रूप से, आप यह dropइंगित करने के लिए पैरामीटर का उपयोग कर सकते हैं कि कौन से कॉलम को नहीं पढ़ा जाना चाहिए:

dat <- fread("data.txt", drop = c("Jul","Aug","Sep","Oct","Nov","Dec"))
dat <- fread("data.txt", drop = c(8:13))

सभी परिणाम:

> data
  Year Jan Feb Mar Apr May Jun
1 2009 -41 -27 -25 -31 -31 -39
2 2010 -41 -27 -25 -31 -31 -39
3 2011 -21 -27  -2  -6 -10 -32

अद्यतन: जब आप freadएक data.table वापस नहीं करना चाहते हैं , तो data.table = FALSE-parameter का उपयोग करें , जैसे:fread("data.txt", select = c(1:7), data.table = FALSE)

2) के साथ read.csv.sqlसे sqldf-package:

एक अन्य विकल्प पैकेज read.csv.sqlसे कार्य है sqldf:

library(sqldf)
dat <- read.csv.sql("data.txt",
                    sql = "select Year,Jan,Feb,Mar,Apr,May,Jun from file",
                    sep = "\t")

3) -पैकेज read_*से readr-functions के साथ:

library(readr)
dat <- read_table("data.txt",
                  col_types = cols_only(Year = 'i', Jan = 'i', Feb = 'i', Mar = 'i',
                                        Apr = 'i', May = 'i', Jun = 'i'))
dat <- read_table("data.txt",
                  col_types = list(Jul = col_skip(), Aug = col_skip(), Sep = col_skip(),
                                   Oct = col_skip(), Nov = col_skip(), Dec = col_skip()))
dat <- read_table("data.txt", col_types = 'iiiiiii______')

प्रलेखन से उपयोग किए गए पात्रों के लिए एक स्पष्टीकरण के साथ col_types:

प्रत्येक वर्ण एक स्तंभ का प्रतिनिधित्व करता है: c = वर्ण, i = पूर्णांक, n = संख्या, d = दोहरा, l = तार्किक, D = दिनांक, T = दिनांक समय, t = समय,? कॉलम को छोड़ने के लिए = अनुमान, या _ / -


freadहालाँकि, संपीड़ित फ़ाइलों का समर्थन नहीं करता है। बड़ी फाइलें आमतौर पर संकुचित होती हैं।
कोडरगुइया

इसमें सक्षम करने के लिए एक सुविधा अनुरोध है fread। वर्थ नोटिंग यह है कि freadअत्यधिक read.tableसंपीड़ित फ़ाइल को संभवतः बहुत तेजी से पढ़ा जाएगा जितना संकुचित फ़ाइल को पढ़ेगा। एक उदाहरण के लिए यहाँ देखें
जाप

कुछ असम्पीडित फ़ाइलें बहुत बड़ी हैं। उदाहरण के लिए, मैं 1000 जीनोम फाइलों के साथ काम कर रहा हूं। वे 60 जीबी असम्पीडित हो सकते हैं।
कोडरग्यूयज

1
जैसा कि आप शायद जानते हैं, आर मेमोरी में डेटा पढ़ता है। चाहे आप ज़िप की गई फ़ाइल पढ़ें या अनज़िप की गई फ़ाइल मेमोरी में परिणामी डेटा के आकार पर कोई फर्क नहीं डाले। यदि आपके पास फ़ाइलों में 60GB है, तो read.tableआपको नहीं बचाएगा। उस स्थिति में, आप ff-पैकेज को देखना चाहते हैं ।
जाप

2
@ डेटा आप freadइस तरह की बड़ी संकुचित फ़ाइलों को पढ़ने के लिए उपयोग कर सकते हैं fread("gunzip -c data.txt.gz", drop = c(8:13)):।
अकोलेक

8

इसे प्राप्त करने के लिए आप JDBC का उपयोग भी कर सकते हैं। चलिए एक नमूना csv फ़ाइल बनाते हैं।

write.table(x=mtcars, file="mtcars.csv", sep=",", row.names=F, col.names=T) # create example csv file

इस लिंक से CSV JDBC ड्राइवर को डाउनलोड और सेव करें: http://sourceforge.net/projects/csvjdbc/files/latest/download

> library(RJDBC)

> path.to.jdbc.driver <- "jdbc//csvjdbc-1.0-18.jar"
> drv <- JDBC("org.relique.jdbc.csv.CsvDriver", path.to.jdbc.driver)
> conn <- dbConnect(drv, sprintf("jdbc:relique:csv:%s", getwd()))

> head(dbGetQuery(conn, "select * from mtcars"), 3)
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1   21   6  160 110  3.9  2.62 16.46  0  1    4    4
2   21   6  160 110  3.9 2.875 17.02  0  1    4    4
3 22.8   4  108  93 3.85  2.32 18.61  1  1    4    1

> head(dbGetQuery(conn, "select mpg, gear from mtcars"), 3)
   MPG GEAR
1   21    4
2   21    4
3 22.8    4

0

आप इसे इस तरह करते हैं:

df = read.table("file.txt", nrows=1, header=TRUE, sep="\t", stringsAsFactors=FALSE)
colClasses = as.list(apply(df, 2, class))
needCols = c("Year", "Jan", "Feb", "Mar", "Apr", "May", "Jun")
colClasses[!names(colClasses) %in% needCols] = list(NULL)
df = read.table("file.txt", header=TRUE, colClasses=colClasses, sep="\t", stringsAsFactors=FALSE)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.