अन्य उत्तर आपको बताएंगे कि कैसे आप जब data.frames की एक सूची बनाने के लिए पहले से ही है data.frames, जैसे, का एक समूह d1
, d2
, .... क्रमिक रूप से नामित डेटा फ्रेम हो रही है एक समस्या है, और उन्हें एक सूची में डालने के एक है अच्छा तय है, लेकिन सबसे अच्छी प्रैक्टिस डेटा का एक गुच्छा होने से बचने के लिए है। पहली जगह में एक सूची में नहीं ।
अन्य उत्तर तत्वों को सूचीबद्ध करने, उन्हें एक्सेस करने आदि के लिए डेटा फ्रेम्स को कैसे असाइन करें, इसके बारे में विस्तार से जानकारी देते हैं। हम इसे यहां भी थोड़ा कवर करेंगे, लेकिन मुख्य बिंदु यह है कि तब तक प्रतीक्षा न करें जब तक आपके पास एक गुच्छा न हो data.frames
उन्हें सूची में जोड़ने के लिए। सूची से शुरू करें।
इस उत्तर के बाकी हिस्से कुछ सामान्य मामलों को कवर करेंगे, जहां आपको अनुक्रमिक चर बनाने के लिए लुभाया जा सकता है, और आपको यह दिखाया जाएगा कि सूची में सीधे कैसे जाएं। यदि आप आर में सूचियों के लिए नए हैं, तो आप को भी पढ़ा चाहते हो सकता है बीच क्या अंतर है [[
और [
एक सूची के तत्वों तक पहुँचने में? ।
शुरू से सूची
कभी भी d1
d2
d3
, ..., dn
पहले स्थान पर न बनाएं । तत्वों के d
साथ एक सूची बनाएं n
।
डेटा फ़्रेम की सूची में कई फ़ाइलों को पढ़ना
फ़ाइलों में पढ़ते समय यह बहुत आसानी से किया जाता है। हो सकता है कि आपको data1.csv, data2.csv, ...
निर्देशिका में फ़ाइलें मिली हों । आपका लक्ष्य data.frames की एक सूची है जिसे कहा जाता है mydata
। पहली चीज जो आपको चाहिए वह सभी फ़ाइल नामों के साथ एक वेक्टर है। आप इसे पेस्ट (जैसे my_files = paste0("data", 1:5, ".csv")
) के साथ बना सकते हैं , लेकिन list.files
सभी उपयुक्त फ़ाइलों को हथियाने के लिए उपयोग करना आसान है my_files <- list.files(pattern = "\\.csv$")
:। आप फ़ाइलों से मिलान करने के लिए नियमित अभिव्यक्तियों का उपयोग कर सकते हैं, अन्य प्रश्नों में नियमित अभिव्यक्तियों के बारे में अधिक पढ़ सकते हैं यदि आपको वहां सहायता की आवश्यकता है। इस तरह आप सभी 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
तेजी से हो जाएगा, या आपको एक अलग फ़ाइल प्रकार के लिए एक अलग फ़ंक्शन की आवश्यकता हो सकती है।
किसी भी तरह से, फाइलों से मिलान करने के लिए सूची तत्वों को नाम देना आसान है
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
, पैकेज , और पुराने कार्यों यह आसान करने के लिए बनाते हैं। सूचियों के साथ आसानी से काम करने वाले लोगों के उदाहरण SO पर हैं।purrr
plyr
l*ply
यहां तक कि अगर आप लूप के लिए नीच का उपयोग करते हैं, तो सूची के तत्वों पर लूप करना बहुत आसान है, क्योंकि इसके साथ चर नामों का निर्माण करना paste
और वस्तुओं को एक्सेस करना है get
। डिबग करने के लिए आसान, भी।
के बारे में सोचो scalability । आप वास्तव में केवल तीन चर, उपयोग करने के लिए यह ठीक की जरूरत है d1
, d2
, d3
। लेकिन तब अगर यह पता चला कि आपको वास्तव में 6 की आवश्यकता है, तो यह बहुत अधिक टाइपिंग है। और अगली बार, जब आप 10 या 20 की जरूरत है, तो आप पाएंगे अपने आप को कॉपी करने और कोड की लाइनों चिपकाने, हो सकता है खोजने का उपयोग कर / बदलने के लिए बदलने के d14
लिए d15
, और आप सोच रहे हैं कि यह कैसे प्रोग्रामिंग होना चाहिए नहीं है । यदि आप एक सूची का उपयोग करते हैं, तो 3 मामलों, 30 मामलों और 300 मामलों के बीच अंतर कोड की एक पंक्ति में होता है --- यदि आपके मामलों की संख्या का स्वचालित रूप से पता लगाया जाता है, तो कोई परिवर्तन नहीं होता है, उदाहरण के लिए, .csv
आपके पास कितनी फाइलें हैं निर्देशिका।
यदि आप अपने डेटा फ़्रेम्स तक पहुँचने के लिए संख्यात्मक सूचकांकों के अलावा किसी अन्य चीज़ का उपयोग करना चाहते हैं, तो आप किसी सूची के तत्वों को नाम दे सकते हैं, (आप XOR विकल्प नहीं हैं)।
कुल मिलाकर, सूचियों का उपयोग करने से आप क्लीनर, आसान-से-पढ़ा जाने वाला कोड लिख पाएंगे, जिसके परिणामस्वरूप कम कीड़े और कम भ्रम होगा।
=
नहीं का उपयोग करें । का उपयोग करके आपके द्वारा बनाए गए और अपने वैश्विक वातावरण और अपने डेटा फ्रेम में क्या आप इसे होना चाहते हैं नहीं है।<-
data.frame()
<-
y1
y2