আমি কীভাবে ডেটা ফ্রেমের একটি তালিকা তৈরি করব?


185

আমি কীভাবে ডেটা ফ্রেমের একটি তালিকা তৈরি করব এবং কীভাবে তালিকা থেকে এই সমস্ত ডেটা ফ্রেমের অ্যাক্সেস করব?

উদাহরণস্বরূপ, আমি কীভাবে এই ডেটা ফ্রেমগুলিকে একটি তালিকায় রাখতে পারি?

d1 <- data.frame(y1 = c(1, 2, 3),
                 y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
                 y2 = c(6, 5, 4))

13
এটি একটি দম্পতির উত্তরে, তবে এখানেও একটি দৃশ্যমান মন্তব্য রাখা উচিত: ভিতরে ব্যবহার করবেন =না । আপনি তৈরি এবং আপনার বৈশ্বিক পরিবেশ এবং আপনার ডেটা ফ্রেম ব্যবহার করে আপনি যা চান তা নয়। <-data.frame()<-y1y2
গ্রেগোর টমাস

37
কোডের এই <-গণ্ডগোলের দিকে তাকান কোনও স্পেস এবং অভ্যন্তরীণ ডেটা.ফ্রেম () এর সাথে। আমি কি নতুন ছিলাম।
বেন

5
আর না. আমি কোড ফর্ম্যাটিং ঠিক করার জন্য আপনার প্রশ্নটি সম্পাদনা করেছি। আপনি নস্টালজিক লাগলে নির্দ্বিধায় উদ্বিগ্ন হন।
ক্লজ উইল্ক

উত্তর:


133

এটি আপনার প্রশ্নের সাথে সম্পর্কিত নয়, তবে আপনি ব্যবহার করতে চান =এবং <-ফাংশন কলের মধ্যে নয় । আপনি যদি ব্যবহার করেন তবে আপনি <-ভেরিয়েবল তৈরি করবেন y1এবং y2আপনি যে পরিবেশে কাজ করছেন তা শেষ করবেন :

d1 <- data.frame(y1 <- c(1, 2, 3), y2 <- c(4, 5, 6))
y1
# [1] 1 2 3
y2
# [1] 4 5 6

এটিতে ডেটা ফ্রেমে কলামের নাম তৈরির আপাতদৃষ্টিতে কাঙ্ক্ষিত প্রভাব থাকবে না:

d1
#   y1....c.1..2..3. y2....c.4..5..6.
# 1                1                4
# 2                2                5
# 3                3                6

=অপারেটর, অপরপক্ষে, আর্গুমেন্ট সঙ্গে আপনার ভেক্টর সংযুক্ত হবে data.frame

আপনার প্রশ্নের হিসাবে, ডেটা ফ্রেমের একটি তালিকা তৈরি করা সহজ:

d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
my.list <- list(d1, d2)

আপনি যেমন অন্য কোনও তালিকার উপাদানটিতে অ্যাক্সেস করবেন ঠিক তেমনভাবে ডেটা ফ্রেমগুলি অ্যাক্সেস করেন:

my.list[[1]]
#   y1 y2
# 1  1  4
# 2  2  5
# 3  3  6

343

অন্যান্য উত্তর আপনি দেখাতে কিভাবে আপনি 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কলামগুলির জন্য))

ডেটা ফ্রেমের একটি তালিকা মার্জ করতে (যোগ দিতে), আপনি এই উত্তরগুলি দেখতে পারেন । প্রায়শই, ধারণাটি ব্যবহার করা হয়Reducemerge এগুলি (বা অন্য কোনও যোগদানের ক্রিয়াকলাপ) এর সাথে ।

কেন একটি তালিকায় তথ্য রাখেন?

তালিকায় অনুরূপ তথ্য রাখুন কারণ আপনার প্রতিটি ডেটা ফ্রেম অনুরূপ কিছু করার চান, এবং মতো কাজগুলির lapply, sapply do.call, প্যাকেজ , এবং পুরানোpurrrplyr l*ply ফাংশন এটা সহজ যে কাজ করতে ভুলবেন না। লোকেরা তালিকা সহ সহজেই কাজগুলি করার উদাহরণগুলি সমস্ত SO এর মধ্যে।

এমনকি যদি আপনি লুপের জন্য নীচু ব্যবহার করেন তবে তালিকার উপাদানগুলির সাথে ভেরিয়েবলের নাম তৈরি করা pasteএবং এর সাথে অ্যাক্সেসগুলি অ্যাক্সেস করার চেয়ে তালিকার উপাদানগুলির উপর লুপ করা অনেক সহজ get। ডিবাগ করাও সহজ।

স্কেলেবিলিটি ভাবুন । আপনি কি সত্যিই শুধুমাত্র তিনটি ভেরিয়েবল ব্যবহার করতে এটা জরিমানা প্রয়োজন d1, d2, d3। তবে তারপরে যদি এটি ঘুরে যায় যে আপনার সত্যিই 6 টি দরকার, এটি অনেক বেশি টাইপিং। এবং পরের বার, যখন আপনার 10 বা 20 প্রয়োজন হবে, আপনি নিজেকে কোডের লাইনগুলি অনুলিপি এবং আটকানো দেখতে পাচ্ছেন, সম্ভবত এটি পরিবর্তন d14করতে সন্ধান / প্রতিস্থাপন ব্যবহার করে d15এবং আপনি কীভাবে প্রোগ্রামিং হওয়া উচিত তা ভাবছেন না । আপনি যদি একটি তালিকা ব্যবহার করেন তবে 3 টি ক্ষেত্রে, 30 টি ক্ষেত্রে এবং 300 টির মধ্যে পার্থক্য কোডের সর্বাধিক এক লাইনের --- আপনার মামলার সংখ্যা স্বয়ংক্রিয়ভাবে সনাক্ত হয়ে গেলে কোনও পরিবর্তন হয় না, উদাহরণস্বরূপ, .csvআপনার মধ্যে কতগুলি ফাইল রয়েছে ডিরেক্টরি।

আপনি যদি আপনার ডেটা ফ্রেমে অ্যাক্সেস করতে সংখ্যাসূচক সূচকগুলি ছাড়া অন্য কিছু ব্যবহার করতে চান তবে আপনি তালিকার উপাদানগুলির নাম রাখতে পারেন (এবং আপনি উভয়ই ব্যবহার করতে পারেন, এটি কোনও এক্সওআর পছন্দ নয়)।

সামগ্রিকভাবে, তালিকাগুলি ব্যবহার আপনাকে ক্লিনার, সহজেই পঠনযোগ্য কোড লিখতে পরিচালিত করবে, যার ফলে কম বাগ এবং কম বিভ্রান্তির সৃষ্টি হবে in


2
আপনি কোন বইয়ের সুপারিশ করেন যা তালিকার সাথে কাজ করে?
পরিত্যক্ত

15
আমি প্রশ্ন ও স্ট্যাক ওভারফ্লো উত্তর উভয় দ্বারা ট্যাগযুক্ত করা হয়েছে পড়া সুপারিশ rএবং list
গ্রেগোর টমাস

2
@ গ্রেগর আমি যুক্ত করতে চাই যে আমরা কেবলমাত্র my_data <- NULL`my_data <- list () 'না দিয়ে বরাদ্দ করে কেবল ফাইলের সাথে তাল মিলিয়ে তালিকার উপাদানগুলির নাম এড়াতে পারি ! :)
ড্যানিয়েল

6
এটা সম্ভব, কিন্তু my_data <- list() এটি পরিষ্কার করে দেয় আপনি একটি তালিকা তৈরি করছেন, যা ভাল! ক্লিয়ার কোড একটি ভাল জিনিস। my_data <- NULLপরিবর্তে ব্যবহারের কোনও সুবিধা দেখছি না।
গ্রেগর টমাস

3
আপনি যা বলেছেন সে সম্পর্কে আমি একমত, তবে আমি যেমন বলেছিলাম, এর ফলে আপনি ফাইলগুলির নামকরণের পর্যায়ে এড়াতে পারবেন। names(my_data) <- gsub("\\.csv$", "", my_files) ;) <br> তবে আমি আপনার পরামর্শকে সম্মান করি কারণ আমি তাদের কাছ থেকে নবাগত হিসাবে অনেক কিছু শিখছি এবং আমি সত্যই এটির প্রশংসা করি :)
ড্যানিয়েল

21

এছাড়াও আপনি সঙ্গে প্রতিটি তালিকা উপাদানের ক্ষেত্রে নির্দিষ্ট কলাম এবং মান অ্যাক্সেস করতে পারেন [এবং [[। এখানে উদাহরণ তুলে ধরা হলো। প্রথমত, আমরা তালিকার প্রতিটি ডেটা ফ্রেমের কেবলমাত্র প্রথম কলামটি অ্যাক্সেস করতে পারি lapply(ldf, "[", 1), যেখানে 1কলাম নম্বরটি নির্দেশ করে।

ldf <- list(d1 = d1, d2 = d2)  ## create a named list of your data frames
lapply(ldf, "[", 1)
# $d1
#   y1
# 1  1
# 2  2
# 3  3
#
# $d2
#   y1
# 1  3
# 2  2
# 3  1

একইভাবে, আমরা দ্বিতীয় কলামের সাথে প্রথম মানটি অ্যাক্সেস করতে পারি

lapply(ldf, "[", 1, 2)
# $d1
# [1] 4
# 
# $d2
# [1] 6

তারপরে আমরা ভেক্টর হিসাবে সরাসরি কলামের মানগুলিও অ্যাক্সেস করতে পারি [[

lapply(ldf, "[[", 1)
# $d1
# [1] 1 2 3
#
# $d2
# [1] 3 2 1

13

আপনার যদি প্রচুর ক্রমযুক্ত নামযুক্ত ডেটা ফ্রেম থাকে তবে আপনি এই জাতীয় ডেটা ফ্রেমের পছন্দসই সাবসেটের একটি তালিকা তৈরি করতে পারেন:

d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))

my.list <- list(d1, d2, d3, d4)
my.list

my.list2 <- lapply(paste('d', seq(2,4,1), sep=''), get)
my.list2

যেখানে my.list2২ য়, তৃতীয় এবং চতুর্থ ডেটা ফ্রেম সমেত একটি তালিকা প্রদান করে।

[[1]]
  y1 y2
1  3  6
2  2  5
3  1  4

[[2]]
  y1 y2
1  6  3
2  5  2
3  4  1

[[3]]
  y1 y2
1  9  8
2  9  8
3  9  8

তবে নোট করুন, তবে উপরের তালিকায় থাকা ডেটা ফ্রেমের নাম আর নেই। আপনি যদি ডেটা ফ্রেমের সাবসেটযুক্ত একটি তালিকা তৈরি করতে চান এবং তাদের নাম সংরক্ষণ করতে চান তবে আপনি এটি চেষ্টা করতে পারেন:

list.function <-  function() { 

     d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
     d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
     d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
     d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))

     sapply(paste('d', seq(2,4,1), sep=''), get, environment(), simplify = FALSE) 
} 

my.list3 <- list.function()
my.list3

যা প্রত্যাবর্তন করে:

> my.list3
$d2
  y1 y2
1  3  6
2  2  5
3  1  4

$d3
  y1 y2
1  6  3
2  5  2
3  4  1

$d4
  y1 y2
1  9  8
2  9  8
3  9  8

> str(my.list3)
List of 3
 $ d2:'data.frame':     3 obs. of  2 variables:
  ..$ y1: num [1:3] 3 2 1
  ..$ y2: num [1:3] 6 5 4
 $ d3:'data.frame':     3 obs. of  2 variables:
  ..$ y1: num [1:3] 6 5 4
  ..$ y2: num [1:3] 3 2 1
 $ d4:'data.frame':     3 obs. of  2 variables:
  ..$ y1: num [1:3] 9 9 9
  ..$ y2: num [1:3] 8 8 8

> my.list3[[1]]
  y1 y2
1  3  6
2  2  5
3  1  4

> my.list3$d4
  y1 y2
1  9  8
2  9  8
3  9  8

2
পরিবর্তে lapply(foo, get), কেবল ব্যবহার করুনmget(foo)
গ্রেগর থমাস

9

প্রদত্ত হিসাবে গ্রহণের সাথে আপনার একই জাতীয় নামের একটি "বৃহত" সংখ্যক ডেটা ফ্রেম রয়েছে (এখানে ডি # যেখানে # কিছু ধনাত্মক পূর্ণসংখ্যা রয়েছে), নীচে @ মার্ক-মিলার পদ্ধতির সামান্য উন্নতি দেওয়া হয়েছে। এটি আরও পরিশ্রুত এবং একটি নাম ফেরত দেয় data.frames তালিকা, যেখানে তালিকার প্রতিটি নাম সংশ্লিষ্ট মূল data.frame নাম।

কীটি mgetএকসাথে ব্যবহার করছে ls। যদি প্রশ্নটিতে প্রদত্ত ডেটা ফ্রেম ডি 1 এবং ডি 2 যদি পরিবেশে D # নামের একমাত্র অবজেক্ট হয় তবে তা

my.list <- mget(ls(pattern="^d[0-9]+"))

যা ফিরে আসবে

my.list
$d1
  y1 y2
1  1  4
2  2  5
3  3  6

$d2
  y1 y2
1  3  6
2  2  5
3  1  4

এই পদ্ধতিটি প্যাটার্ন আর্গুমেন্টটির সুবিধা গ্রহণ করে ls, যা আমাদের নিয়মিত অভিব্যক্তিগুলি পরিবেশে অবজেক্টগুলির নামগুলির সূক্ষ্ম বিশ্লেষণ করতে সহায়তা করে। রেজেক্সের বিকল্প "^d[0-9]+$"হ'ল"^d\\d+$"

@ গ্রেগর যেমন উল্লেখ করেছে , আপনার ডেটা নির্মানের প্রক্রিয়াটি সেট আপ করা আরও ভাল সামগ্রিক যাতে ডেটা.ফ্রেমগুলি শুরুতে নামকরণের তালিকাগুলিতে রাখে।

উপাত্ত

d1 <- data.frame(y1 = c(1,2,3),y2 = c(4,5,6))
d2 <- data.frame(y1 = c(3,2,1),y2 = c(6,5,4))

3

এটি কিছুটা দেরিতে হতে পারে তবে আপনার উদাহরণে ফিরে গিয়ে আমি ভেবেছিলাম আমি উত্তরটি কেবল একটি বাড়াতে প্রসারিত করব।

 D1 <- data.frame(Y1=c(1,2,3), Y2=c(4,5,6))
 D2 <- data.frame(Y1=c(3,2,1), Y2=c(6,5,4))
 D3 <- data.frame(Y1=c(6,5,4), Y2=c(3,2,1))
 D4 <- data.frame(Y1=c(9,9,9), Y2=c(8,8,8))

তারপরে আপনি সহজেই আপনার তালিকা তৈরি করুন:

mylist <- list(D1,D2,D3,D4)

এখন আপনার কাছে একটি তালিকা রয়েছে তবে তালিকার অ্যাক্সেসের পরিবর্তে পুরানো উপায় যেমন

mylist[[1]] # to access 'd1'

আপনি এই ফাংশনটি আপনার পছন্দসই ডেটাফ্রেম প্রাপ্ত ও নির্ধারণ করতে ব্যবহার করতে পারেন।

GETDF_FROMLIST <- function(DF_LIST, ITEM_LOC){
   DF_SELECTED <- DF_LIST[[ITEM_LOC]]
   return(DF_SELECTED)
}

এখন আপনি যা চান তা পান।

D1 <- GETDF_FROMLIST(mylist, 1)
D2 <- GETDF_FROMLIST(mylist, 2)
D3 <- GETDF_FROMLIST(mylist, 3)
D4 <- GETDF_FROMLIST(mylist, 4)

আশা করি অতিরিক্ত বিট সাহায্য করবে।

চিয়ার্স!


2
হ্যাঁ আমি জানি তবে কোনও কারণে যখন আমি অনুলিপি করেছি এবং পেস্ট করেছি তখন সমস্ত কিছু ক্যাপগুলিতে চলে গেছে। :( কোন ঘটনা ছোট হাতের কাজ কোড।
ML_for_now

4
আমি কৌতূহল করছি আপনি কেন পছন্দ GETDF_FROMLIST(mylist, 1)করবেন mylist[[1]]? আপনি যদি ফাংশন সিনট্যাক্স পছন্দ করেন তবে আপনি "[["(mylist, 1)কোনও কাস্টম ফাংশন সংজ্ঞায়িত না করেও করতে পারেন ।
গ্রেগর থমাস

4
আপনি আপনার ফাংশন সংজ্ঞাটিও সহজ করতে পারেন, ফাংশনটির পুরো শরীরটি কেবলমাত্র হতে পারে return(DF_LIST[[ITEM_LOC]]), একটি মধ্যবর্তী ভেরিয়েবল বরাদ্দ করার দরকার নেই।
গ্রেগর থমাস

1

খুব সহজ ! আমার পরামর্শটি এখানে:

আপনি যদি আপনার কর্মক্ষেত্রের ডেটাফ্রেমগুলি নির্বাচন করতে চান তবে এটি ব্যবহার করে দেখুন:

Filter(function(x) is.data.frame(get(x)) , ls())

অথবা

ls()[sapply(ls(), function(x) is.data.frame(get(x)))]

এই সমস্ত একই ফলাফল দেবে।

আপনি is.data.frameঅন্যান্য ধরণের ভেরিয়েবলগুলি পরীক্ষা করতে পরিবর্তন করতে পারেনis.function


1

আমি নিজেকে সম্পূর্ণ নবাগত হিসাবে বিবেচনা করি তবে আমার মনে হয় যে এখানে মূল বক্তব্যটি বর্ণিত হয়নি এমন একটির কাছে আমার কাছে অত্যন্ত সরল উত্তর রয়েছে: ডেটা ফ্রেম বা এর অংশগুলি অ্যাক্সেস করা।

আসুন উপরে বর্ণিত হিসাবে ডেটা ফ্রেম দিয়ে তালিকা তৈরি করে শুরু করুন:

d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))

d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))

my.list <- list(d1, d2)

তারপরে, আপনি যদি কোনও একটি ডেটা ফ্রেমের একটি নির্দিষ্ট মান অ্যাক্সেস করতে চান তবে আপনি ডাবল বন্ধনীগুলি ক্রমিকভাবে ব্যবহার করে তা করতে পারেন। প্রথম সেটটি আপনাকে ডেটা ফ্রেমে নিয়ে যায় এবং দ্বিতীয় সেট আপনাকে নির্দিষ্ট স্থানাঙ্কে নিয়ে যায়:

my.list[[1]][[3,2]]

[1] 6
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.