অন্যান্য উত্তর আপনি দেখাতে কিভাবে আপনি data.frames একটি তালিকা তৈরি করতে ইতিমধ্যেই আছে data.frames, যেমন, একটি গুচ্ছ d1
, d2
, .... ক্রমানুসারে নামে ডেটা ফ্রেম হচ্ছে না একটা সমস্যা, এবং সেগুলিকে একটি তালিকায় নির্বাণ একটি হল ভাল ফিক্স, তবে সেরা অনুশীলন হ'ল গুচ্ছ ডেটা রাখা এড়ানো। ফ্রেমগুলি প্রথম স্থানে তালিকায় নেই।
অন্যান্য উত্তরগুলি কীভাবে উপাত্তগুলি তালিকাভুক্ত করতে ডেটা ফ্রেমগুলি নির্ধারণ করতে পারে, সেগুলি অ্যাক্সেস করতে পারে ইত্যাদি সম্পর্কে প্রচুর বিশদ দেয় We আমরা এখানে এটিকেও একটু কভার করব, তবে মূল পয়েন্টটি বলতে হবে আপনার কাছে একটি গুচ্ছ না হওয়া পর্যন্ত অপেক্ষা করবেন না say তাদের একটি তালিকায় যুক্ত করতে। তালিকা দিয়ে শুরু করুন।data.frames
এই উত্তরটির বাকী অংশটি এমন কয়েকটি সাধারণ কেসকে কভার করবে যেখানে আপনাকে অনুক্রমিক ভেরিয়েবলগুলি তৈরি করতে প্ররোচিত হতে পারে এবং কীভাবে সরাসরি তালিকায় যেতে হয় তা আপনাকে দেখায়। আপনি যদি আর এর তালিকায় নতুন হন তবে আপনি এটিও পড়তে চাইতে পারেন কোনও তালিকার উপাদানগুলির মধ্যে [[
এবং [
অ্যাক্সেসের মধ্যে পার্থক্য কী ? ।
শুরু থেকে তালিকা
কি তৈরি করবেন না d1
d2
d3
, ..., dn
প্রথম স্থানে। উপাদানগুলির d
সাথে একটি তালিকা তৈরি করুন n
।
ডেটা ফ্রেমের তালিকায় একাধিক ফাইল পড়া
এটি ফাইলগুলিতে পড়ার সময় খুব সহজেই করা হয়। হয়ত আপনারা data1.csv, data2.csv, ...
একটি ডিরেক্টরিতে ফাইল পেয়েছেন । আপনার লক্ষ্যটি ডেটা.ফ্রেমস নামে পরিচিত mydata
। আপনার প্রথম যে জিনিসটি দরকার তা হ'ল সমস্ত ফাইলের নাম সহ একটি ভেক্টর। আপনি পেস্ট সঙ্গে এই গঠন করা যেতে পারে (যেমন, my_files = paste0("data", 1:5, ".csv")
), কিন্তু এটা সম্ভবত ব্যবহার করা আরো সহজ list.files
সব যথাযথ ফাইল নিতে: my_files <- list.files(pattern = "\\.csv$")
। আপনি ফাইলগুলির সাথে মেলে নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন, আপনার যদি সেখানে সাহায্যের প্রয়োজন হয় তবে অন্যান্য প্রশ্নগুলিতে নিয়মিত প্রকাশ সম্পর্কে আরও পড়তে পারেন। এইভাবে আপনি সমস্ত সিএসভি ফাইল দুর্দান্ত নামকরণের স্কিমটি অনুসরণ না করেও দখল করতে পারেন। অথবা আপনি যদি কিছু সিএসভি ফাইল সেগুলির একটি গুচ্ছ থেকে বের করে নিতে চান তবে আপনি একটি ফ্যানসিয়ার রেজেক্স প্যাটার্ন ব্যবহার করতে পারেন।
এই মুহুর্তে, বেশিরভাগ আর আরম্ভকারীরা একটি for
লুপ ব্যবহার করবে এবং এতে কোনও ভুল নেই, এটি ঠিক কাজ করে।
my_data <- list()
for (i in seq_along(my_files)) {
my_data[[i]] <- read.csv(file = my_files[i])
}
এটি করার আরও একটি আর-এর মতো lapply
উপায়টি রয়েছে যা উপরের জন্য একটি শর্টকাট
my_data <- lapply(my_files, read.csv)
অবশ্যই, read.csv
উপযুক্ত হিসাবে অন্যান্য ডেটা আমদানি ফাংশন বিকল্প করুন । readr::read_csv
বা data.table::fread
দ্রুততর হবে, বা আপনার অন্য কোনও ফাইল টাইপের জন্য আলাদা ফাংশনও লাগতে পারে।
যে কোনও উপায়ে, ফাইলগুলির সাথে তাল মিলিয়ে তালিকার উপাদানগুলির নাম দেওয়া সহজ y
names(my_data) <- gsub("\\.csv$", "", my_files)
# or, if you prefer the consistent syntax of stringr
names(my_data) <- stringr::str_replace(my_files, pattern = ".csv", replacement = "")
ডেটা ফ্রেমের তালিকায় একটি ডেটা ফ্রেমকে বিভক্ত করা
এটি অত্যন্ত সহজ, বেস ফাংশনটি split()
এটি আপনার জন্য করে। আপনি ডেটার কলাম (বা কলাম) বা অন্য যে কোনও কিছু দ্বারা বিভক্ত করতে পারেন
mt_list = split(mtcars, f = mtcars$cyl)
# This gives a list of three data frames, one for each value of cyl
ক্রস-বৈধতার জন্য কোনও ডেটা ফ্রেমকে টুকরো টুকরো করার একটি দুর্দান্ত উপায়। হতে পারে আপনি mtcars
প্রশিক্ষণ, পরীক্ষা এবং বৈধতার অংশগুলিতে বিভক্ত করতে চান ।
groups = sample(c("train", "test", "validate"),
size = nrow(mtcars), replace = TRUE)
mt_split = split(mtcars, f = groups)
# and mt_split has appropriate names already!
ডেটা ফ্রেমের একটি তালিকা সিমুলেট করা
হতে পারে আপনি ডেটা সিমুলেট করছেন, এরকম কিছু:
my_sim_data = data.frame(x = rnorm(50), y = rnorm(50))
তবে কে কেবল একটি সিমুলেশন করে? আপনি এটি 100 বার, 1000 বার, আরও করতে চান! তবে আপনি আপনার কর্মক্ষেত্রে 10,000 টি ডেটা ফ্রেম চান না । replicate
এগুলি ব্যবহার করে একটি তালিকায় রাখুন:
sim_list = replicate(n = 10,
expr = {data.frame(x = rnorm(50), y = rnorm(50))},
simplify = F)
এই ক্ষেত্রে বিশেষত, আপনার সত্যিকার অর্থে পৃথক ডেটা ফ্রেম দরকার কিনা তাও বিবেচনা করা উচিত, বা "গ্রুপ" কলামের সাথে একটি একক ডেটা ফ্রেমও ঠিক কাজ করবে? ডেটা ফ্রেমে "গ্রুপ অনুসারে" জিনিসগুলি ব্যবহার করা data.table
বা dplyr
এটি বেশ সহজ।
আমি আমার তথ্য একটি তালিকায় রাখিনি :( আমি পরের বার করব, তবে আমি এখন কী করতে পারি?
যদি সেগুলি একটি বিজোড় ভাণ্ডার হয় (যা অস্বাভাবিক) তবে আপনি কেবল তাদের এ নিয়োগ করতে পারেন:
mylist <- list()
mylist[[1]] <- mtcars
mylist[[2]] <- data.frame(a = rnorm(50), b = runif(50))
...
যদি আপনার কোনও নকশায় নামযুক্ত ডেটা ফ্রেম থাকে, যেমন df1
,df2
, df3
, এবং আপনি তাদের একটি তালিকায় চাই, আপনি যা করতে পারেন get
তাদের আপনি একটি রেগুলার এক্সপ্রেশন নাম মেলে লিখতে পারেন। কিছুটা এইরকম
df_list = mget(ls(pattern = "df[0-9]"))
# this would match any object with "df" followed by a digit in its name
# you can test what objects will be got by just running the
ls(pattern = "df[0-9]")
# part and adjusting the pattern until it gets the right objects.
সাধারণত, mget
একাধিক অবজেক্ট পেতে এবং তাদেরকে একটি তালিকাভুক্ত তালিকায় ফিরিয়ে আনতে ব্যবহৃত হয়। এর অংশটি get
একটি একক অবজেক্ট পেতে এবং এটি ফেরত দিতে (তালিকায় নয়) ব্যবহৃত হয়।
একক ডেটা ফ্রেমে ডেটা ফ্রেমের তালিকার সংমিশ্রণ
একটি সাধারণ কাজ হ'ল ডেটা ফ্রেমের একটি তালিকা একটি বড় ডেটা ফ্রেমে সংযুক্ত করা। আপনি যদি একে অপরের উপরে এই স্ট্যাক করতে চান তবে আপনি তাদের rbind
একটি জোড়া ব্যবহার করতে পারেন , তবে ডেটা ফ্রেমের তালিকার জন্য এখানে তিনটি ভাল পছন্দ রয়েছে:
# base option - slower but not extra dependencies
big_data = do.call(what = rbind, args = df_list)
# data table and dplyr have nice functions for this that
# - are much faster
# - add id columns to identify the source
# - fill in missing values if some data frames have more columns than others
# see their help pages for details
big_data = data.table::rbindlist(df_list)
big_data = dplyr::bind_rows(df_list)
(একইভাবে ব্যবহার করা হচ্ছে cbind
বা dplyr::bind_cols
কলামগুলির জন্য))
ডেটা ফ্রেমের একটি তালিকা মার্জ করতে (যোগ দিতে), আপনি এই উত্তরগুলি দেখতে পারেন । প্রায়শই, ধারণাটি ব্যবহার করা হয়Reduce
merge
এগুলি (বা অন্য কোনও যোগদানের ক্রিয়াকলাপ) এর সাথে ।
কেন একটি তালিকায় তথ্য রাখেন?
তালিকায় অনুরূপ তথ্য রাখুন কারণ আপনার প্রতিটি ডেটা ফ্রেম অনুরূপ কিছু করার চান, এবং মতো কাজগুলির lapply
, sapply
do.call
, প্যাকেজ , এবং পুরানোpurrr
plyr
l*ply
ফাংশন এটা সহজ যে কাজ করতে ভুলবেন না। লোকেরা তালিকা সহ সহজেই কাজগুলি করার উদাহরণগুলি সমস্ত SO এর মধ্যে।
এমনকি যদি আপনি লুপের জন্য নীচু ব্যবহার করেন তবে তালিকার উপাদানগুলির সাথে ভেরিয়েবলের নাম তৈরি করা paste
এবং এর সাথে অ্যাক্সেসগুলি অ্যাক্সেস করার চেয়ে তালিকার উপাদানগুলির উপর লুপ করা অনেক সহজ get
। ডিবাগ করাও সহজ।
স্কেলেবিলিটি ভাবুন । আপনি কি সত্যিই শুধুমাত্র তিনটি ভেরিয়েবল ব্যবহার করতে এটা জরিমানা প্রয়োজন d1
, d2
, d3
। তবে তারপরে যদি এটি ঘুরে যায় যে আপনার সত্যিই 6 টি দরকার, এটি অনেক বেশি টাইপিং। এবং পরের বার, যখন আপনার 10 বা 20 প্রয়োজন হবে, আপনি নিজেকে কোডের লাইনগুলি অনুলিপি এবং আটকানো দেখতে পাচ্ছেন, সম্ভবত এটি পরিবর্তন d14
করতে সন্ধান / প্রতিস্থাপন ব্যবহার করে d15
এবং আপনি কীভাবে প্রোগ্রামিং হওয়া উচিত তা ভাবছেন না । আপনি যদি একটি তালিকা ব্যবহার করেন তবে 3 টি ক্ষেত্রে, 30 টি ক্ষেত্রে এবং 300 টির মধ্যে পার্থক্য কোডের সর্বাধিক এক লাইনের --- আপনার মামলার সংখ্যা স্বয়ংক্রিয়ভাবে সনাক্ত হয়ে গেলে কোনও পরিবর্তন হয় না, উদাহরণস্বরূপ, .csv
আপনার মধ্যে কতগুলি ফাইল রয়েছে ডিরেক্টরি।
আপনি যদি আপনার ডেটা ফ্রেমে অ্যাক্সেস করতে সংখ্যাসূচক সূচকগুলি ছাড়া অন্য কিছু ব্যবহার করতে চান তবে আপনি তালিকার উপাদানগুলির নাম রাখতে পারেন (এবং আপনি উভয়ই ব্যবহার করতে পারেন, এটি কোনও এক্সওআর পছন্দ নয়)।
সামগ্রিকভাবে, তালিকাগুলি ব্যবহার আপনাকে ক্লিনার, সহজেই পঠনযোগ্য কোড লিখতে পরিচালিত করবে, যার ফলে কম বাগ এবং কম বিভ্রান্তির সৃষ্টি হবে in
=
না । আপনি তৈরি এবং আপনার বৈশ্বিক পরিবেশ এবং আপনার ডেটা ফ্রেম ব্যবহার করে আপনি যা চান তা নয়।<-
data.frame()
<-
y1
y2