কেবলমাত্র নির্বাচিত কলামগুলি পড়ুন


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
এটি কোনও ফাইল থেকে আর-তে কেবল নির্বাচিত কলামগুলি পড়ার উপায়গুলির সদৃশ ? , ডার্ক তার উত্তরেNULL কলাম শ্রেণি হিসাবে উল্লেখ করেছেন ।
মেরেক


2
@ সিরোসন্টিলি 包子 露 宪 六四 事件 法轮功 নিশ্চিত তবে ... আমি কি আগে জিজ্ঞাসা করেছি?
স্টারকব

আমি আরও ভাল / খারাপ সম্পর্কের কথা বলছিলাম না। তদুপরি কোনও ক্রস সাইটের ডুপ্লিকেট নেই, অসম্পূর্ণ স্ট্যাক এক্সচেঞ্জ নেটওয়ার্ক তাদের অনুমতি দেয়, যদি না আপনি নিজের পোস্টটি ক্রস করেন :-)
সিওরো সান্তিলি 郝海东 冠状 病 六四 六四 法轮功

উত্তর:


157

ডেটা ফাইলে আছে বলুন data.txt, আপনি কলামগুলি এড়িয়ে যাওয়ার পক্ষে colClassesযুক্তিটি ব্যবহার করতে পারেন read.table()। এখানে প্রথম col টি কলামের ডেটা রয়েছে "integer"এবং আমরা বাকি col টি কলামগুলি "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
@ বেঞ্জামিন যুক্তি ব্যবহার করে ফাইল থেকে প্রথম কয়েক লাইন পড়ুন nrows। তারপরে সেখানে কয়টি কলাম ব্যবহার করছে ncol()তা নিয়ে কাজ করুন বা অন্যথায় আপনি পড়ার / উপেক্ষা করার জন্য কলামগুলির সংখ্যাটি নিয়ে কাজ করতে চান। তারপরে এই তথ্যটি ব্যবহার করে পুরো ফাইলটি পড়ুন।
গ্যাভিন সিম্পসন

1
?? আপনি যদি কলামগুলির সংখ্যা জানেন না তবে আপনি আরও কতগুলি অনুমান করার জন্য এটি কিছুটা না পড়ে এটি নির্ধারণ করতে চলেছেন?
গ্যাভিন সিম্পসন

1
@ ব্লুম্যাগিস্টার count.fields()মন্তব্যগুলিতে প্রস্তাবিত প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে সম্পাদনা করার এবং তার উল্লেখ করার জন্য ধন্যবাদ Thanks
গ্যাভিন সিম্পসন

1
@ লোওলোপল্ড হার্টজ 준영 না, এবং আমি নিশ্চিত নই যে এই জাতীয় জিনিসটি কীভাবে ডেটা ফ্রেমের মতো সারি ক্লাসগুলির জন্য কাজ করবে , যখন প্রতিটি কলাম আলাদা ধরণের হতে পারে, প্রতিটি সারি সংজ্ঞা অনুসারে এবং ফলস্বরূপ, সংবিঘ্নিত। আমদানির সময় আপনাকে ফাঁকা সারি ইত্যাদি ফিল্টার আউট করতে হবে।
গ্যাভিন সিম্পসন

1
@rmf আপনি count.fields()কোনও পাঠ্য সংযোগটি পাস করতে পারেন , সুতরাং, সারিগুলির কয়েকটি উপসেটটি ব্যবহার txt <- readLines(....)করে পড়ুন con <- textConnection(txt), তারপরে লাইনে পঠনের সাথে সংযোগ তৈরি করুন , তারপরে করুন count.fields(txt)। ব্যবহার নিশ্চিত করুন skipযে count.fields()শিরোলেখ সারি এড়িয়ে যেতে যদি কেউ থাকে; আপনি ফাইলটিতে সারিগুলি এড়িয়ে যেতে পারবেন না readLines()
গ্যাভিন সিম্পসন

82

আপনাকে একটি ডেটাসেট থেকে কলামগুলির একটি নির্দিষ্ট সেট পড়তে, আরও বেশ কয়েকটি বিকল্প রয়েছে:

1) প্যাকেজ freadথেকে data.table:

আপনি প্যাকেজ থেকে selectপ্যারামিটার সহ কাঙ্ক্ষিত কলামগুলি নির্দিষ্ট করতে পারেন । আপনি কলামের নাম বা কলাম সংখ্যার ভেক্টর সহ কলামগুলি নির্দিষ্ট করতে পারেন।freaddata.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কোনও ডেটা ফেরত দিতে চান না want টেবিল , -পরিমিতি ব্যবহার করুন data.table = FALSE, যেমন:fread("data.txt", select = c(1:7), data.table = FALSE)

2) প্যাকেজ read.csv.sqlথেকে sqldf:

আর একটি বিকল্প প্যাকেজ 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ফাংশন সহ:

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:

প্রতিটি অক্ষর একটি কলাম প্রতিনিধিত্ব করে: সি = অক্ষর, i = পূর্ণসংখ্যা, n = সংখ্যা, d = ডাবল, l = যৌক্তিক, ডি = তারিখ, টি = তারিখের সময়, টি = সময়,? = অনুমান, বা _ / - কলামটি এড়িয়ে যেতে


freadসংক্ষিপ্ত ফাইলগুলি সমর্থন করে না। বড় ফাইলগুলি সাধারণত সংকুচিত হয়।
কোডারগুই 123

এটি সক্রিয় করার জন্য একটি বৈশিষ্ট্য অনুরোধ আছে fread। মূল্যবান বিবেচনাটি হ'ল সংকুচিত ফাইলটি পড়ার freadচেয়ে read.tableকমপ্রেসড ফাইলটি সম্ভবত খুব দ্রুত পড়বে। একটি উদাহরণের জন্য এখানে দেখুন
জাপ

কিছু সঙ্কুচিত ফাইল খুব বড়। যেমন আমি 1000 জিনোম ফাইল নিয়ে কাজ করছি working এগুলি 60 গিগাবাইট সঙ্কুচিত হতে পারে।
কোডারগুই 123

1
আপনি সম্ভবত জানেন যে, আর মেমরির মধ্যে ডেটা পড়ে। আপনি জিপড ফাইলটি পড়ুন বা আনজিপড ফাইল মেমরির ফলে প্রাপ্ত ডেটার আকারের ক্ষেত্রে কোনও পার্থক্য তৈরি করবে না। আপনার কাছে 60 জিবি ফাইল থাকলে, read.tableআপনাকে বাঁচায় না। সেক্ষেত্রে আপনি ffপ্যাকেজটি দেখতে চাইবেন।
জাপ

2
@Deleet আপনি ব্যবহার করতে পারে freadএই রকম বৃহৎ সংকুচিত ফাইলগুলি পড়তে: fread("gunzip -c data.txt.gz", drop = c(8:13))
arekolek

8

এটি অর্জনের জন্য আপনি জেডিবিসিও ব্যবহার করতে পারেন। আসুন একটি নমুনা সিএসভি ফাইল তৈরি করি।

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.