কিভাবে একটি দুর্দান্ত আর প্রজননযোগ্য উদাহরণ তৈরি করতে হয়


2473

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

একটি চমৎকার উদাহরণ তৈরি করার জন্য আপনার টিপস কি? আপনি কীভাবে ডেটা স্ট্রাকচারগুলি আটকানএকটি পাঠ্য বিন্যাসে? আপনার আর কোন তথ্য অন্তর্ভুক্ত করা উচিত?

ব্যবহার ছাড়াও অন্যান্য কৌশল আছে dput(), dump()বা structure()? আপনার কখন অন্তর্ভুক্ত করা উচিত library()বা require()বিবৃতি দেওয়া উচিত ? কোনটি শব্দ সংরক্ষিত উচিত এক এড়িয়ে চলুন ছাড়াও করার c, df, data, ইত্যাদি?

একজন কীভাবে দুর্দান্ত তৈরি করে প্রজননযোগ্য উদাহরণ?


34
আমি প্রশ্নের সুযোগ সম্পর্কে বিভ্রান্ত। লোকেরা এসও বা আর-সহায়তা (কীভাবে "ত্রুটিটি পুনরুত্পাদন করতে পারে") বিষয়ে প্রশ্ন জিজ্ঞাসা করতে প্রজননযোগ্য উদাহরণের ব্যাখ্যায় ঝাঁপিয়ে পড়েছে বলে মনে হয়। সহায়তা পৃষ্ঠাগুলিতে পুনরায় উত্পাদনযোগ্য আর উদাহরণগুলি সম্পর্কে কী? প্যাকেজ ডেমোতে? টিউটোরিয়াল / উপস্থাপনায়?
baptiste

15
@ ব্যাপটিস্ট: একই বিয়োগ ত্রুটি। আমি যে সমস্ত কৌশলগুলি ব্যাখ্যা করেছি তা প্যাকেজ সহায়তা পৃষ্ঠাগুলিতে এবং টিউটোরিয়াল এবং উপস্থাপনাগুলিতে আমি আর সম্পর্কে দিচ্ছি
Joris Meys

33
কাঠামো অনুকরণ করা খুব জটিল হতে পারে বলে ডেটা কখনও কখনও সীমাবদ্ধ ফ্যাক্টর হয়। ব্যক্তিগত ডেটা থেকে জনসাধারণের ডেটা উত্পাদন করতে: স্ট্যাকওভারফ্লো . com
এতিয়েন লো-ডেকারি

উত্তর:


1726

একটি সর্বনিম্ন পুনরুত্পাদনযোগ্য উদাহরণ নিম্নলিখিত আইটেমগুলি নিয়ে গঠিত:

  • একটি ন্যূনতম ডেটাसेट, সমস্যাটি প্রদর্শনের জন্য প্রয়োজনীয়
  • ত্রুটিটি পুনরুত্পাদন করার জন্য প্রয়োজনীয় ন্যূনতম চলমানযোগ্য কোড, যা প্রদত্ত ডেটাसेटে চালানো যেতে পারে
  • ব্যবহৃত প্যাকেজ, আর সংস্করণ এবং সিস্টেমের প্রয়োজনীয় তথ্য এটি চালু আছে।
  • এলোমেলো প্রক্রিয়াগুলির ক্ষেত্রে, set.seed()পুনরুত্পাদনযোগ্যতা 1 এর জন্য একটি বীজ (সেট করে )

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

ন্যূনতম ডেটাসেট তৈরি করা

বেশিরভাগ ক্ষেত্রে, কিছু মান সহ কেবল একটি ভেক্টর / ডেটা ফ্রেম সরবরাহ করে এটি সহজেই করা যায়। অথবা আপনি বিল্ট-ইন ডেটাসেটগুলির মধ্যে একটি ব্যবহার করতে পারেন, যা বেশিরভাগ প্যাকেজ সহ সরবরাহ করা হয়।
বিল্ট-ইন ডেটাসেটগুলির একটি বিস্তৃত তালিকা সহ দেখা যেতে পারে library(help = "datasets")। প্রতিটি ডেটাসেটের একটি সংক্ষিপ্ত বিবরণ রয়েছে এবং আরও তথ্যের উদাহরণ পাওয়া যেতে পারে ?mtcarsযেখানে তালিকার 'এমটিকার্স' ডেটাসেটগুলির মধ্যে একটি with অন্যান্য প্যাকেজগুলিতে অতিরিক্ত ডেটাসেট থাকতে পারে।

ভেক্টর তৈরি করা সহজ। কখনও কখনও এটিতে কিছু এলোমেলো যোগ করা প্রয়োজন, এবং এটি তৈরি করার জন্য পুরো সংখ্যক ফাংশন রয়েছে। sample()কোনও ভেক্টরকে এলোমেলো করতে পারে, বা কয়েকটি মান সহ একটি র্যান্ডম ভেক্টর দিতে পারে। lettersবর্ণমালা সমন্বিত একটি দরকারী ভেক্টর। এটি ফ্যাক্টর তৈরির জন্য ব্যবহার করা যেতে পারে।

কয়েকটি উদাহরণ:

  • এলোমেলো মান: x <- rnorm(10)সাধারণ বিতরণের x <- runif(10)জন্য, অভিন্ন বিতরণের জন্য, ...
  • কিছু মানের x <- sample(1:10)অনুক্রম : ভেক্টরের জন্য 1:10 এলোমেলো ক্রমে।
  • একটি এলোমেলো ফ্যাক্টর: x <- sample(letters[1:4], 20, replace = TRUE)

ম্যাট্রিক্সের জন্য, কেউ ব্যবহার করতে পারেন matrix(), যেমন:

matrix(1:10, ncol = 2)

ব্যবহার করে ডেটা ফ্রেম তৈরি করা যায় data.frame()। ডেটা ফ্রেমে প্রবেশের নামগুলিতে মনোযোগ দেওয়া উচিত এবং এটি অত্যধিক জটিল না করে।

একটি উদাহরণ :

set.seed(1)
Data <- data.frame(
    X = sample(1:10),
    Y = sample(c("yes", "no"), 10, replace = TRUE)
)

কিছু প্রশ্নের জন্য, নির্দিষ্ট ফর্ম্যাটগুলির প্রয়োজন হতে পারে। এই জন্য, প্রদান করা কোন ব্যবহার করতে পারেন as.someType: ফাংশন as.factor, as.Date, as.xtsভেক্টর এবং / বা তথ্য ফ্রেম ঠাট সঙ্গে একযোগে ... এই।

আপনার তথ্য অনুলিপি করুন

আপনি কিছু তথ্য হলো, এই টিপস ব্যবহার গঠন করা খুব কঠিন হবে থাকে, তাহলে আপনি সবসময় আপনার আসল ডেটা একটি উপসেট করতে পারেন, ব্যবহার head(), subset()বা সূচকের। তারপরে dput()আমাদের এমন কিছু দেওয়ার জন্য ব্যবহার করুন যা তাৎক্ষণিকভাবে আর-তে লাগানো যেতে পারে:

> dput(iris[1:4, ]) # first four rows of the iris data set
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5, 
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2, 
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = c("setosa", 
"versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

যদি আপনার ডেটা ফ্রেমের অনেকগুলি স্তরের একটি ফ্যাক্টর থাকে তবে dputআউটপুটটি অযৌক্তিক হতে পারে কারণ এটি এখনও আপনার সম্ভাব্য সমস্ত ফ্যাক্টরের স্তরগুলি তালিকাভুক্ত করবে যদিও তারা আপনার ডেটার উপসেটটিতে উপস্থিত না থাকে। এই সমস্যাটি সমাধান করার জন্য, আপনি droplevels()ফাংশনটি ব্যবহার করতে পারেন । প্রজাতিগুলি কেবলমাত্র একটি মাত্রার একটি উপাদান হিসাবে নীচে লক্ষ্য করুন:

> dput(droplevels(iris[1:4, ]))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5, 
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2, 
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = "setosa",
class = "factor")), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

ব্যবহার করার সময় dput, আপনি কেবল প্রাসঙ্গিক কলামগুলি অন্তর্ভুক্ত করতে চাইতে পারেন:

> dput(mtcars[1:3, c(2, 5, 6)]) # first three rows of columns 2, 5, and 6
structure(list(cyl = c(6, 6, 4), drat = c(3.9, 3.9, 3.85), wt = c(2.62, 
2.875, 2.32)), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710"
), class = "data.frame")

এর জন্য অন্য একটি সতর্কতা dputহ'ল এটি কীড data.tableবস্তুগুলির জন্য বা গোষ্ঠীভুক্ত tbl_df(শ্রেণি grouped_df) থেকে কাজ করবে না dplyr। এই ক্ষেত্রে আপনি ভাগ করার আগে একটি নিয়মিত ডেটা ফ্রেমে ফিরে রূপান্তর করতে পারেন dput(as.data.frame(my_data)),।

সবচেয়ে খারাপ পরিস্থিতি, আপনি একটি পাঠ্য উপস্থাপনা দিতে পারেন যা এর textপ্যারামিটারটি ব্যবহার করে পড়া যায় read.table:

zz <- "Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa"

Data <- read.table(text=zz, header = TRUE)

ন্যূনতম কোড উত্পাদন করা হচ্ছে

এটি সহজ অংশ হওয়া উচিত তবে প্রায়শই হয় না। আপনার যা করা উচিত নয় তা হ'ল:

  • সমস্ত ধরণের ডেটা রূপান্তর যুক্ত করুন। সরবরাহ করা ডেটা ইতিমধ্যে সঠিক ফর্ম্যাটে রয়েছে তা নিশ্চিত করুন (যদি না এটি অবশ্যই সমস্যা হয়)
  • একটি সম্পূর্ণ ত্রুটি দেয় এমন কোড / কোডের পুরো ফাংশনটি কপি-পেস্ট করুন। প্রথমে কোন রেখাগুলি ঠিক ত্রুটির ফল দেয় তা সনাক্ত করার চেষ্টা করুন। প্রায়শই না হওয়ার পরে আপনি নিজেই সমস্যাটি কী তা খুঁজে পাবেন।

আপনার যা করা উচিত তা হ'ল:

  • আপনি যদি কোনও (ব্যবহার করে library()) ব্যবহার করেন তবে কোন প্যাকেজগুলি ব্যবহার করা উচিত তা যুক্ত করুন
  • যদি আপনি সংযোগগুলি খোলেন বা ফাইল তৈরি করেন, সেগুলি বন্ধ করার জন্য কিছু কোড যুক্ত করুন বা ফাইলগুলি মুছে দিন (ব্যবহার করে unlink())
  • আপনি যদি বিকল্পগুলি পরিবর্তন করেন তবে নিশ্চিত হয়ে নিন যে কোডটিতে সেগুলিকে মূলগুলিতে ফিরিয়ে দেওয়ার জন্য একটি বিবৃতি রয়েছে। (যেমন op <- par(mfrow=c(1,2)) ...some code... par(op))
  • কোডটি চালানো যায় কিনা তা নিশ্চিত করতে একটি নতুন, খালি আর সেশনে আপনার কোডটি পরীক্ষা করুন। লোকেরা কনসোলে আপনার ডেটা এবং আপনার কোডটি কেবল অনুলিপি করতে এবং আপনার মতো ঠিক একইভাবে পেতে সক্ষম হবে।

অতিরিক্ত তথ্য দিন

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

আপনি যদি আর স্টুডিও ব্যবহার করে আর এ চালাচ্ছেন তবে rstudioapi::versionInfo()আপনার আরস্টুডিও সংস্করণটি প্রতিবেদন করতে সহায়ক হতে পারে।

নির্দিষ্ট প্যাকেজটিতে আপনার যদি সমস্যা হয় তবে আপনি আউটপুট দিয়ে প্যাকেজের সংস্করণ সরবরাহ করতে চাইতে পারেন packageVersion("name of the package")


1 দ্রষ্টব্য:set.seed() আর> 3.6.0 এবং পূর্ববর্তী সংস্করণগুলির মধ্যে পার্থক্যের আউটপুট । আপনি এলোমেলো প্রক্রিয়াটির জন্য কোন আর সংস্করণটি ব্যবহার করেছেন তা নির্দিষ্ট করুন এবং পুরানো প্রশ্ন অনুসরণ করার পরে আপনি কিছুটা ভিন্ন ফলাফল পেয়ে অবাক হবেন না। এই জাতীয় ক্ষেত্রে একই ফল পেতে, আপনি RNGversion()ফাংশনটি আগে ব্যবহার করতে পারেন set.seed()(যেমন RNGversion("3.5.2"):)।


6
dputযদি ডেটাফ্রেম খুব বড় হয় এবং ডেটাফ্রেমের মাঝখানে সমস্যা উত্পন্ন হয় তবে আপনি কীভাবে ব্যবহার করবেন? dput60 থেকে 70 সারিগুলিতে ডেটাটির মধ্য বিভাগটি পুনরুত্পাদন করার জন্য কি কোনও উপায় আছে ?
বিগনআর

27
@ বিগনআর আপনি সূচকগুলি ব্যবহার করে ডেটা ফ্রেমের কিছু অংশ বের করতে পারেন, যেমন: tmp <- mydf[50:70,]তারপরে dput(mydf)। যদি ডেটা ফ্রেমটি সত্যই বড় হয় তবে সমস্যাটিকে আলাদা করে দেখার চেষ্টা করুন এবং সমস্যাটির কারণ হিসাবে কয়েকটি লাইন জমা দিন।
জোরিস মাইস

4
@ জরিসমিজ: পুনরাবৃত্তভাবে N কে স্তরকে ডেটা বলতে headবা dputসীমাবদ্ধ করার কোনও উপায় আছে কি ? আমি প্রজননযোগ্য উদাহরণ নিয়ে আসার চেষ্টা করছি এবং আমার ডেটা ডেটা ফ্রেমের একটি তালিকা। সুতরাং, dput(head(myDataObj))এটি যথেষ্ট না বলে মনে হচ্ছে, কারণ এটি 14 এমবি আকারের আউটপুট ফাইল তৈরি করে।
আলেকসান্ডার ব্লেক

5
@ জরিসমিজ: জাস্ট এফআইআই - উপরের মন্তব্যে একটি পৃথক প্রশ্ন হিসাবে প্রশ্ন পোস্ট করেছেন: স্ট্যাকওভারফ্লো / প্রশ্ন / 25127026/…
আলেকসান্দ্র ব্লেক

4
@ কনরাড আপনি যা করতে পারেন তার মধ্যে সবচেয়ে ভাল কাজটি হল ফাইলটির লিঙ্ক এবং সেই ফাইলটিতে পড়ার জন্য ন্যূনতম কমান্ড দিন give ডুপেট () :) এর আউটপুট কপি-পেস্ট করার চেয়ে কম ঝামেলা হবে
জোরিস মে

589

( পুনরুত্পাদনযোগ্য উদাহরণ কীভাবে লিখতে হয় সে সম্পর্কে আমার পরামর্শ এখানে । আমি এটি সংক্ষিপ্ত হলেও মিষ্টি করার চেষ্টা করেছি)

একটি পুনরুত্পাদনযোগ্য উদাহরণ কীভাবে লিখবেন।

আপনি যদি পুনরুত্পাদনযোগ্য উদাহরণ সরবরাহ করেন তবে আপনি সম্ভবত আপনার আর সমস্যার সাথে ভাল সহায়তা পেতে পারেন। একটি পুনরুত্পাদনযোগ্য উদাহরণ কেবল আর কোডটি অনুলিপি এবং আটকানো দ্বারা অন্য কাউকে আপনার সমস্যাটি পুনরায় তৈরি করতে দেয়।

আপনার উদাহরণকে পুনরায় উত্পাদনযোগ্য করে তুলতে আপনাকে চারটি জিনিস অন্তর্ভুক্ত করতে হবে: প্রয়োজনীয় প্যাকেজ, ডেটা, কোড এবং আপনার আর পরিবেশের বর্ণনা।

  • প্যাকেজগুলি স্ক্রিপ্টের শীর্ষে লোড করা উচিত, সুতরাং উদাহরণটি কোনটি প্রয়োজন তা সহজেই দেখা যায়।

  • কোনও ইমেল বা স্ট্যাক ওভারফ্লো প্রশ্নে ডেটা অন্তর্ভুক্ত করার সবচেয়ে সহজ উপায় হ'ল dput()এটি পুনরায় তৈরি করার জন্য আর কোড উত্পন্ন করতে। উদাহরণস্বরূপ, mtcarsআর এ ডেটাসেটটি পুনরায় তৈরি করতে , আমি নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করব:

    1. চালান dput(mtcars)আর
    2. আউটপুট অনুলিপি করুন
    3. আমার পুনরুত্পাদনযোগ্য স্ক্রিপ্টে টাইপ করুন mtcars <-তারপর পেস্ট করুন।
  • আপনার কোডটি নিশ্চিত করে কিছুটা সময় ব্যয় করুন অন্যের পক্ষে পড়ার পক্ষে সহজ :

    • নিশ্চিত করুন যে আপনি স্পেস ব্যবহার করেছেন এবং আপনার পরিবর্তনশীল নামগুলি সংক্ষিপ্ত, তবে তথ্যপূর্ণ

    • আপনার সমস্যাটি কোথায় রয়েছে তা নির্দেশ করতে মন্তব্যগুলি ব্যবহার করুন

    • সমস্যার সাথে সম্পর্কিত নয় এমন সমস্ত কিছু মুছে ফেলার জন্য যথাসাধ্য চেষ্টা করুন।
      আপনার কোডটি যত কম হবে তা বোঝা সহজ।

  • sessionInfo()আপনার কোডে একটি মন্তব্যে আউটপুট অন্তর্ভুক্ত করুন । এটি আপনার আর পরিবেশের সংক্ষিপ্তসার জানায় এবং আপনি কোনও মেয়াদোত্তীর্ণ প্যাকেজটি ব্যবহার করছেন কিনা তা পরীক্ষা করা সহজ করে তোলে।

আপনি একটি তাজা আর সেশন শুরু করে এবং আপনার স্ক্রিপ্টটি এখানে আটকানো দিয়ে আপনি পুনরায় প্রজননযোগ্য উদাহরণ তৈরি করতে পারেন।

আপনার সমস্ত কোড কোনও ইমেল দেওয়ার আগে, এটি জিস্ট গিথুব এ রাখার বিষয়টি বিবেচনা করুন । এটি আপনার কোডটিকে দুর্দান্ত সিনট্যাক্স হাইলাইট করবে এবং ইমেল সিস্টেম দ্বারা কোনও কিছুতে জড়িয়ে পড়ার বিষয়ে আপনাকে চিন্তা করতে হবে না।


24
reprextidyverseন্যূনতম, পুনরুত্পাদনযোগ্য উদাহরণ উত্পাদন করার জন্য ইন একটি ভাল প্যাকেজ: github.com/tidyverse/mittedx
mt1022

19
আমি নিয়মিত সেগুলিতে কোড সহ ইমেলগুলি পাই। এমনকি আমি সংযুক্ত শব্দের ডকুমেন্ট সহ ইমেলগুলি পাই receive কখনও কখনও আমি এমনকি সংযুক্ত শব্দ নথির সাথে ইমেল পাই যেখানে স্ক্রিনশটস কোড থাকে।
হ্যাডলি

304

ব্যক্তিগতভাবে, আমি "এক" লাইনার পছন্দ করি। লাইন বরাবর কিছু:

my.df <- data.frame(col1 = sample(c(1,2), 10, replace = TRUE),
        col2 = as.factor(sample(10)), col3 = letters[1:10],
        col4 = sample(c(TRUE, FALSE), 10, replace = TRUE))
my.list <- list(list1 = my.df, list2 = my.df[3], list3 = letters)

ডেটা স্ট্রাকচারটিতে লেখকের সমস্যার ধারণাটি নকল করা উচিত এবং সঠিক ভারব্যাটিক কাঠামো নয়। ভেরিয়েবলগুলি যখন আমার নিজস্ব ভেরিয়েবলগুলি বা godশ্বর নিষেধ না করে, ফাংশনগুলি (যেমন পছন্দ করে) তখন সত্যই আমি এটির প্রশংসা করিdf ) ।

বিকল্পভাবে, কেউ কয়েকটি কর্নার কেটে একটি প্রাক-বিদ্যমান ডেটা সেটকে নির্দেশ করতে পারে, এরকম কিছু:

library(vegan)
data(varespec)
ord <- metaMDS(varespec)

আপনি যে বিশেষ প্যাকেজ ব্যবহার করছেন তা উল্লেখ করতে ভুলবেন না।

আপনি যদি বৃহত্তর অবজেক্টগুলিতে কিছু প্রদর্শন করার চেষ্টা করছেন তবে আপনি চেষ্টা করতে পারেন

my.df2 <- data.frame(a = sample(10e6), b = sample(letters, 10e6, replace = TRUE))

আপনি যদি rasterপ্যাকেজের মাধ্যমে স্থানিক ডেটা নিয়ে কাজ করছেন তবে আপনি কিছু এলোমেলো ডেটা তৈরি করতে পারেন। প্যাকেজ ভিগনেটে প্রচুর উদাহরণ পাওয়া যায়, তবে এখানে একটি ছোট্ট ন্যাকেট।

library(raster)
r1 <- r2 <- r3 <- raster(nrow=10, ncol=10)
values(r1) <- runif(ncell(r1))
values(r2) <- runif(ncell(r2))
values(r3) <- runif(ncell(r3))
s <- stack(r1, r2, r3)

যদি আপনার প্রয়োগ হিসাবে কিছু স্থানিক বস্তুর প্রয়োজন হয় sp, আপনি "স্থানিক" প্যাকেজগুলিতে (টাস্ক ভিউগুলিতে স্পেসিয়াল ভিউ দেখুন) বাহ্যিক ফাইলগুলির (যেমন ESRI শেফফিলের মতো) মাধ্যমে কিছু ডেটাসেট পেতে পারেন।

library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")

1
আইএমএইচও, ব্যবহার করার সময় sampleবা runifএটি বুদ্ধিমান set.seed। কমপক্ষে, স্যাম্পলিং বা এলোমেলো সংখ্যা জেনারেশন সম্পর্কিত রিলে সম্পর্কিত উদাহরণগুলি তৈরি করার সময় আমি এই পরামর্শটি পেয়েছি।
কনরাড

1
@ কনরাড আমি সম্মত, তবে এটি নির্ভর করতে পারে। আপনি যদি কেবল কয়েকটি সংখ্যার উত্পাদন করার চেষ্টা করছেন তবে একটি বীজের প্রয়োজন হতে পারে না তবে আপনি যদি নির্দিষ্ট কিছু সংখ্যক প্রয়োজন সেখানে নির্দিষ্ট কিছু বোঝার চেষ্টা করছেন তবে একটি বীজ বাধ্যতামূলক হবে।
রোমান Luštrik

1
এটি বীজ ইমো দিয়ে সর্বদা উন্নত, প্রত্যাশিত আউটপুটটির নিজস্ব সমাধানের তুলনা করা এবং নিজের মধ্যে সমাধানগুলির তুলনা করা সহজ করে তোলে এবং এইভাবে যে ব্যবহারকারীরা জানেন না (এবং জানার দরকার নেই) এর মতো ফাংশন জানেন না runifবা sampleবিভ্রান্ত হন না যে তারা একই তথ্য পেতে পারে না।
মুডি_ মুডসকিপার

2
@ মিকি আপনি ইউএসএমেপ প্যাকেজটির দিকে নজর রেখেছেন ?
রোমান Luštrik

2
@ মিমি প্যাকেজ টাইগ্রিস বিভিন্ন আদলে সেন্সাস ব্যুরো থেকে শেফফাইল ডাউনলোড করে
ক্যামিল

277

এই খুব পোস্ট দ্বারা অনুপ্রাণিত, আমি এখন একটি কার্যকরী ফাংশন ব্যবহার
reproduce(<mydata>)করি যখন আমাকে স্ট্যাকওভারফ্লোতে পোস্ট করতে হবে।


দ্রুত নির্দেশাবলী

যদি myDataপুনরুত্পাদন করার জন্য আপনার অবজেক্টের নাম হয় তবে নিম্নলিখিতটি আরতে চালান:

install.packages("devtools")
library(devtools)
source_url("https://raw.github.com/rsaporta/pubR/gitbranch/reproduce.R")

reproduce(myData)

বিবরণ:

এই ফাংশনটি বুদ্ধিমান মোড়ক dputএবং নিম্নলিখিতটি করে:

  • স্বয়ংক্রিয়ভাবে একটি বড় ডেটা সেট সেট করে (আকার এবং শ্রেণীর উপর ভিত্তি করে S নমুনা আকারটি সামঞ্জস্য করা যায়)
  • সৃষ্টি করে a dput আউটপুট
  • আপনাকে কোন কলামগুলি রফতানি করতে হবে তা নির্দিষ্ট করতে দেয়
  • এর সম্মুখভাগে সংযোজন করা হয় objName <- ...যাতে এটি অনুলিপি করে + কাস্ট করা যায় তবে ...
  • যদি কোনও ম্যাকের সাথে কাজ করা হয় তবে আউটপুটটি স্বয়ংক্রিয়ভাবে ক্লিপবোর্ডে অনুলিপি করা হয়, যাতে আপনি কেবল এটি চালাতে পারেন এবং তারপরে আপনার প্রশ্নে আটকানো যেতে পারে।

উত্স এখানে উপলব্ধ:


উদাহরণ:

# sample data
DF <- data.frame(id=rep(LETTERS, each=4)[1:100], replicate(100, sample(1001, 100)), Class=sample(c("Yes", "No"), 100, TRUE))

ডিএফ প্রায় 100 x 102. আমি 10 টি সারি এবং কয়েকটি নির্দিষ্ট কলামের নমুনা নিতে চাই

reproduce(DF, cols=c("id", "X1", "X73", "Class"))  # I could also specify the column number. 

নিম্নলিখিত আউটপুট দেয়:

This is what the sample looks like: 

    id  X1 X73 Class
1    A 266 960   Yes
2    A 373 315    No            Notice the selection split 
3    A 573 208    No           (which can be turned off)
4    A 907 850   Yes
5    B 202  46   Yes         
6    B 895 969   Yes   <~~~ 70 % of selection is from the top rows
7    B 940 928    No
98   Y 371 171   Yes          
99   Y 733 364   Yes   <~~~ 30 % of selection is from the bottom rows.  
100  Y 546 641    No        


    ==X==============================================================X==
         Copy+Paste this part. (If on a Mac, it is already copied!)
    ==X==============================================================X==

 DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L, 25L, 25L), .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"), class = "factor"), X1 = c(266L, 373L, 573L, 907L, 202L, 895L, 940L, 371L, 733L, 546L), X73 = c(960L, 315L, 208L, 850L, 46L, 969L, 928L, 171L, 364L, 641L), Class = structure(c(2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L), .Label = c("No", "Yes"), class = "factor")), .Names = c("id", "X1", "X73", "Class"), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L)) 

    ==X==============================================================X==

আরও লক্ষ করুন যে আউটপুটটির সম্পূর্ণতা একক দীর্ঘ, দীর্ঘ লাইনে, কাটা আপ লাইনগুলির একটি লম্বা অনুচ্ছেদ নয়। এটি এসও প্রশ্ন পোস্টে পড়া সহজ করে তোলে এবং কপি + পেস্ট করা আরও সহজ করে তোলে।


অক্টোবর 2013 আপডেট করুন:

আপনি এখন পাঠ্য আউটপুটটির কতগুলি লাইন গ্রহণ করবেন তা নির্দিষ্ট করতে পারেন (যেমন, আপনি স্ট্যাকওভারফ্লোতে কী আটকান)। ব্যবহারlines.out=n এই জন্য যুক্তি। উদাহরণ:

reproduce(DF, cols=c(1:3, 17, 23), lines.out=7) উৎপাদনের:

    ==X==============================================================X==
         Copy+Paste this part. (If on a Mac, it is already copied!)
    ==X==============================================================X==

 DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L,25L, 25L), .Label
      = c("A", "B", "C", "D", "E", "F", "G", "H","I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V", "W", "X", "Y"), class = "factor"),
      X1 = c(809L, 81L, 862L,747L, 224L, 721L, 310L, 53L, 853L, 642L),
      X2 = c(926L, 409L,825L, 702L, 803L, 63L, 319L, 941L, 598L, 830L),
      X16 = c(447L,164L, 8L, 775L, 471L, 196L, 30L, 420L, 47L, 327L),
      X22 = c(335L,164L, 503L, 407L, 662L, 139L, 111L, 721L, 340L, 178L)), .Names = c("id","X1",
      "X2", "X16", "X22"), class = "data.frame", row.names = c(1L,2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L))

    ==X==============================================================X==

196

এখানে একটি ভাল গাইড

সর্বাধিক গুরুত্বপূর্ণ বিষয়টি: কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি কোডের একটি ছোট টুকরা তৈরি করেছেন যা আমরা সমস্যা কী তা দেখার জন্য চালাতে পারি । এর জন্য একটি দরকারী ফাংশন dput(), তবে আপনার যদি খুব বড় ডেটা থাকে তবে আপনি একটি ছোট নমুনা ডেটাसेट তৈরি করতে চাইতে পারেন বা কেবল প্রথম 10 লাইন ব্যবহার করতে পারেন।

সম্পাদনা করুন:

সমস্যাটি নিজেই কোথায় তা আপনি চিহ্নিত করেছেন তাও নিশ্চিত করে নিন। উদাহরণটিতে "অন লাইনে 200 তে একটি ত্রুটি আছে" এমন একটি সম্পূর্ণ আর স্ক্রিপ্ট হওয়া উচিত নয়। আপনি যদি আর (আমি ভালোবাসি browser()) এবং গুগলে ডিবাগিং সরঞ্জামগুলি ব্যবহার করেন তবে আপনার সমস্যাটি সত্যই চিহ্নিত করতে সক্ষম হবে এবং একই জিনিসটি ভুল হয়ে গেলে এমন একটি তুচ্ছ উদাহরণ পুনরুত্পাদন করতে সক্ষম হওয়া উচিত।


165

আর-হেল্প মেইলিং তালিকায় একটি পোস্টিং গাইড রয়েছে যা ডেটা উত্পন্ন করার উদাহরণ সহ প্রশ্ন জিজ্ঞাসা এবং উত্তর উভয়কেই কভার করে:

উদাহরণ: কখনও কখনও এটি একটি ছোট উদাহরণ প্রদান করতে সহায়তা করে যা কেউ আসলে চালাতে পারে। উদাহরণ স্বরূপ:

আমার কাছে ম্যাট্রিক্স এক্স থাকলে নিম্নরূপ:

  > x <- matrix(1:8, nrow=4, ncol=2,
                dimnames=list(c("A","B","C","D"), c("x","y"))
  > x
    x y
  A 1 5
  B 2 6
  C 3 7
  D 4 8
  >

আমি কীভাবে এটিকে 8 টি সারি, এবং 'সারি', 'কল', এবং 'মান' নামে তিনটি কলামের ডেটাফ্রেমে রূপান্তর করতে পারি, যার 'সারি' এবং 'কল' এর মান হিসাবে মাত্রা নাম রয়েছে:

  > x.df
     row col value
  1    A   x      1

...
(যার উত্তর হতে পারে:

  > x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
                    varying=list(colnames(x)), times=colnames(x),
                    v.names="value", timevar="col", idvar="row")

)

ছোট শব্দটি বিশেষভাবে গুরুত্বপূর্ণ। আপনার একটি ন্যূনতম প্রজননযোগ্য উদাহরণের জন্য লক্ষ্য করা উচিত , যার অর্থ সমস্যাটি ব্যাখ্যা করার জন্য ডেটা এবং কোডটি যথাসম্ভব সহজ হওয়া উচিত।

সম্পাদনা: কুরুচিপূর্ণ কোডের চেয়ে সুন্দর কোডটি পড়া সহজ। একটি স্টাইল গাইড ব্যবহার করুন ।


164

আর .২.১৪ (আমার ধারণা) আপনি আপনার ডেটা পাঠ্যের উপস্থাপনাটি সরাসরি এগুলিতে খাওয়াতে পারবেন read.table:

 df <- read.table(header=TRUE, 
  text="Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
") 

3
@ সেবাস্তিয়ান-সি পুনরুত্পাদনযোগ্য উদাহরণ তৈরি করার পক্ষে এটি কীভাবে ভাল ?? :)
টিএমএস

@ টিএমএস এটিকে গুরুতর চিন্তাভাবনা প্রদান করে, যদি প্রশ্নকর্তা ডেটা সরবরাহ করে থাকেন এবং সমস্যাটি যদি ছোট হয় (তবে কয়েকটি সমাধান থাকতে পারে) তবে এটি দ্রুততর হতে পারে এবং আপনি এখনও সমস্ত পদক্ষেপগুলি অনুসরণ করতে পারেন।
সেবাস্তিয়ান-সি

146

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

  • ওয়েবে কোথাও ডেটা পোস্ট করা এবং একটি URL সরবরাহ করা প্রয়োজন হতে পারে।
  • যদি ডেটা জনসাধারণের কাছে প্রকাশ্যে প্রকাশ না করা যায় তবে একেবারে ভাগ করে নেওয়া যায়, তবে আপনি আগ্রহী পক্ষগুলিতে এটি ইমেল করার প্রস্তাব দিতে সক্ষম হতে পারেন (যদিও এটি কাজ করতে বিরক্ত করবে এমন লোকের সংখ্যা হ্রাস পাবে) চালু কর).
  • আমি আসলে এটি সম্পন্ন করে দেখিনি, কারণ যে সমস্ত লোকেরা তাদের তথ্য প্রকাশ করতে পারে না তারা এটি কোনও ফর্ম প্রকাশের বিষয়ে সংবেদনশীল, তবে এটি প্রশংসনীয় বলে মনে হয় যে কোনও কোনও ক্ষেত্রে এটি যথেষ্ট পরিমাণে বেনামে / স্ক্র্যাম্বলড / সামান্য দূষিত থাকলে ডেটা পোস্ট করতে পারে some কোনভাবে.

যদি আপনি এর মধ্যে দুটিও না করতে পারেন তবে আপনার সমস্যা সমাধানের জন্য আপনার সম্ভবত পরামর্শদাতা নেওয়া দরকার ...

সম্পাদনা : অনামীকরণ / স্ক্র্যাম্বলিংয়ের জন্য দুটি দরকারী এসও প্রশ্ন:


1
সিন্থেটিক ডেটা সেট তৈরি করার জন্য, এই প্রশ্নের উত্তরগুলি এর প্রয়োগগুলি fitdistrএবং সহ দরকারী উদাহরণ দেয় fitdistrplus
ইলেটর

137

এখনও পর্যন্ত উত্তরগুলি প্রজননযোগ্যতার অংশের জন্য অবশ্যই দুর্দান্ত। এটি কেবল স্পষ্ট করেই বলা যায় যে কোনও প্রজননযোগ্য উদাহরণ কোনও প্রশ্নের একমাত্র উপাদান হতে পারে না এবং হওয়া উচিত নয়। আপনি কীভাবে দেখতে চান এবং আপনার সমস্যার রূপকথাগুলি বোঝাতে ভুলবেন না, কেবল এখন পর্যন্ত আপনি কীভাবে সেখানে যাওয়ার চেষ্টা করেছেন not কোড যথেষ্ট নয়; আপনারও শব্দ দরকার।

কী করা থেকে বিরত থাকতে হবে তার পুনঃপ্রনামযোগ্য উদাহরণ এখানে (একটি বাস্তব উদাহরণ থেকে আঁকা, নিরীহদের সুরক্ষার জন্য নাম পরিবর্তন করা হয়েছে):


নীচে নমুনা ডেটা এবং ফাংশনের একটি অংশ যা আমার সাথে সমস্যা হচ্ছে।

code
code
code
code
code (40 or so lines of it)

আমি কীভাবে এটি অর্জন করতে পারি?



124

আমার কাছে একটি আর উদাহরণ তৈরি করার খুব সহজ এবং দক্ষ উপায় আছে যা উপরে বর্ণিত হয়নি। আপনি প্রথমে আপনার কাঠামো সংজ্ঞায়িত করতে পারেন। উদাহরণ স্বরূপ,

mydata <- data.frame(a=character(0), b=numeric(0),  c=numeric(0), d=numeric(0))

>fix(mydata)

আপনি যখন 'ফিক্স' কমান্ড কার্যকর করবেন, আপনি এই পপ-আপ বক্সটি পাবেন

তারপরে আপনি নিজের ডেটা ম্যানুয়ালি ইনপুট করতে পারেন। এটি বড় উদাহরণগুলির চেয়ে ছোট উদাহরণগুলির জন্য দক্ষ।


18
... তারপরেdput(mydata)
জিএসি

আপনার সীমানা কি? একটি সম্পূর্ণ উত্তর পেয়ে ভাল লাগবে। ইত্যাদি এমন একটি ডেটা তৈরি করুন যা আপনি সরাসরি পছন্দ করতে পারেন for (d in data) {...}
লিও লোপোল্ড হার্টজ 준영

119

দ্রুত তৈরি করতে একটি dput আপনার ডেটা করতে আপনি কেবল আপনার ক্লিপবোর্ডে ডেটা অনুলিপি করতে পারেন (এক টুকরো) এবং নিম্নলিখিতটি আরতে চালাতে পারেন:

এক্সেলে ডেটা জন্য:

dput(read.table("clipboard",sep="\t",header=TRUE))

একটি টেক্সট ফাইলে ডেটার জন্য:

dput(read.table("clipboard",sep="",header=TRUE))

প্রয়োজনে আপনি sepপরবর্তীগুলিতে পরিবর্তন করতে পারেন। আপনার ডেটা অবশ্যই ক্লিপবোর্ডে থাকলে এটি কাজ করবে।


116

নির্দেশিকা:


আপনার প্রশ্নগুলি তৈরিতে আপনার মূল লক্ষ্যটি হওয়া উচিত পাঠকদের পক্ষে তাদের সিস্টেমে আপনার সমস্যাটি বোঝা এবং পুনরুত্পাদন করা যতটা সম্ভব সহজ করা। তাই না:

  1. ইনপুট ডেটা সরবরাহ করুন
  2. প্রত্যাশিত আউটপুট সরবরাহ করুন
  3. আপনার সমস্যাটি সংক্ষেপে ব্যাখ্যা করুন
    • আপনার যদি 20 টিরও বেশি পাঠ্য + কোডের লাইন থাকে তবে আপনি সম্ভবত ফিরে যেতে পারেন এবং সরল করতে পারেন
    • সমস্যা / ত্রুটি সংরক্ষণের সময় আপনার কোডটি যথাসম্ভব সরল করুন

এটি কিছু কাজ করে তবে এটিকে ন্যায্য বাণিজ্য হিসাবে মনে হচ্ছে, যেহেতু আপনি অন্যকে আপনার জন্য কাজ করতে বলছেন।

ডেটা সরবরাহ করা:


অন্তর্নির্মিত ডেটা সেটগুলি

এখন পর্যন্ত সেরা বিকল্প হ'ল বিল্ট-ইন ডেটাসেটগুলির উপর নির্ভর করা। এটি আপনার সমস্যার উপর অন্যের পক্ষে কাজ করা খুব সহজ করে তোলে। আপনার data()কাছে কী ডেটা উপলব্ধ তা দেখতে আর প্রম্পটে টাইপ করুন । কিছু ক্লাসিক উদাহরণ:

  • iris
  • mtcars
  • ggplot2::diamonds (বাহ্যিক প্যাকেজ, তবে প্রায় প্রত্যেকেরই এটি রয়েছে)

আপনার সমস্যার জন্য উপযুক্ত ডেটা সেটগুলি কীভাবে খুঁজে পাবেন সে জন্য এই এসও কিউএ দেখুন ।

আপনি যদি অন্তর্নির্মিত ডেটাসেটগুলি ব্যবহার করতে আপনার সমস্যাটি পুনঃব্যবস্থা করতে সক্ষম হন তবে আপনাকে ভাল উত্তর পাওয়ার সম্ভাবনা অনেক বেশি (এবং আপডেটগুলি)।

স্ব উত্পন্ন ডেটা Data

যদি আপনার সমস্যাটি এমন এক ধরণের ডেটার সাথে খুব নির্দিষ্ট থাকে যা বিদ্যমান ডেটা সেটগুলিতে উপস্থাপিত হয় না, তবে আর কোডটি প্রদান করুন যা আপনার সমস্যাটি নিজেকে প্রকাশ করে এমন ছোট্ট সম্ভাব্য ডেটাসেট তৈরি করে code উদাহরণ স্বরূপ

set.seed(1)  # important to make random data reproducible
myData <- data.frame(a=sample(letters[1:5], 20, rep=T), b=runif(20))

এখন যে কেউ আমার প্রশ্নের উত্তর দেওয়ার চেষ্টা করছেন সে দুটি লাইন অনুলিপি / পেস্ট করতে এবং তাত্ক্ষণিকভাবে সমস্যার কাজ শুরু করতে পারেন।

dput

শেষ অবলম্বন হিসাবে , আপনি dputকোনও ডেটা অবজেক্টটিকে আর কোডে (যেমন dput(myData)) রূপান্তর করতে ব্যবহার করতে পারেন । আমি একটি "সর্বশেষ অবলম্বন" হিসাবে বলি কারণ এর আউটপুট dputপ্রায়শই অমনোযোগী হয়, অনুলিপি করে অনুলিপি করে এবং আপনার বাকী প্রশ্নটিকে অস্পষ্ট করে।

প্রত্যাশিত আউটপুট সরবরাহ করুন:


কেউ একবার বলেছিলেন:

প্রত্যাশিত আউটপুটটির একটি ছবি মূল্য 1000 শব্দ

- খুব জ্ঞানী ব্যক্তি person

যদি আপনি "আমি এই ফলাফলটি পাব বলে আশা করি" এর মতো কিছু যুক্ত করতে পারেন:

   cyl   mean.hp
1:   6 122.28571
2:   4  82.63636
3:   8 209.21429

আপনার প্রশ্নে লোকেরা আপনি কী করার চেষ্টা করছেন তা দ্রুত বুঝতে পারে। যদি আপনার প্রত্যাশিত ফলাফলটি বড় এবং অযথাযুক্ত হয় তবে আপনার সমস্যাটি কীভাবে সহজ করা যায় সে সম্পর্কে আপনি সম্ভবত যথেষ্ট চিন্তা করেননি (পরবর্তী দেখুন)।

আপনার সমস্যা সফলভাবে ব্যাখ্যা করুন


করণীয় হ'ল প্রধান বিষয় হ'ল আপনার প্রশ্ন জিজ্ঞাসার আগে আপনার সমস্যাটিকে যতটা সম্ভব সহজ করা to বিল্ট-ইন ডেটাসেটগুলির সাথে কাজ করার জন্য সমস্যার পুনরায় ফ্রেমিং করা এ ক্ষেত্রে অনেক সহায়তা করবে। আপনি প্রায়শই দেখতে পাবেন যে সরলকরণের প্রক্রিয়াটি পেরিয়ে আপনি নিজের সমস্যার উত্তর দেবেন।

এখানে ভাল প্রশ্নের কয়েকটি উদাহরণ রয়েছে:

উভয় ক্ষেত্রেই ব্যবহারকারীর সমস্যাগুলি তারা সরবরাহ করে এমন সাধারণ উদাহরণগুলির সাথে প্রায় নয়। বরং তারা তাদের সমস্যার প্রকৃতি বিমূর্ত করে এবং তাদের প্রশ্ন জিজ্ঞাসার জন্য এটি একটি সাধারণ ডেটা সেটটিতে প্রয়োগ করে।

কেন এখনও এই প্রশ্নের উত্তর?


এই উত্তরটি আমার কাছে সর্বোত্তম অনুশীলন বলে মনে করে: অন্তর্নির্মিত ডেটা সেট ব্যবহার করুন এবং একটি ন্যূনতম ফর্মের ফলে আপনি যা প্রত্যাশা করেন তা সরবরাহ করুন। সর্বাধিক বিশিষ্ট উত্তরগুলি অন্যান্য দিকগুলিতে ফোকাস করে। আমি এই উত্তরটি কোনও সুনামের কাছে উঠার আশা করি না; এটি কেবলমাত্র এখানে তাই আমি নবাগত প্রশ্নের মন্তব্যে এর সাথে লিঙ্ক করতে পারি।


113

সহায়তা পেতে পুনরুত্পাদনযোগ্য কোড কী। তবে, এমন অনেক ব্যবহারকারী রয়েছেন যা তাদের ডেটাগুলির একটি অংশও পেস্ট করার বিষয়ে সন্দেহবাদী হতে পারে। উদাহরণস্বরূপ, তারা সংবেদনশীল ডেটা বা গবেষণামূলক গবেষণাপত্রে ব্যবহারের জন্য সংগৃহীত কোনও মূল ডেটা নিয়ে কাজ করতে পারে। যে কোনও কারণে, আমি ভেবেছিলাম আমার ডেটা প্রকাশ্যে আটকানোর আগে এটি "বিকৃত" করার জন্য একটি কার্যকর কাজ করা ভাল হবে। anonymizeপ্যাকেজ থেকে ফাংশন SciencesPoখুব নিরীহ, কিন্তু আমার জন্য এটি সঙ্গে চমত্কারভাবে কাজ করে dputফাংশন।

install.packages("SciencesPo")

dt <- data.frame(
    Z = sample(LETTERS,10),
    X = sample(1:10),
    Y = sample(c("yes", "no"), 10, replace = TRUE)
)

> dt
   Z  X   Y
1  D  8  no
2  T  1 yes
3  J  7  no
4  K  6  no
5  U  2  no
6  A 10 yes
7  Y  5  no
8  M  9 yes
9  X  4 yes
10 Z  3  no

তারপরে আমি এটিকে বেনামে রেখেছি:

> anonymize(dt)
     Z    X  Y
1   b2  2.5 c1
2   b6 -4.5 c2
3   b3  1.5 c1
4   b4  0.5 c1
5   b7 -3.5 c1
6   b1  4.5 c2
7   b9 -0.5 c1
8   b5  3.5 c2
9   b8 -1.5 c2
10 b10 -2.5 c1

বেনামে নাম এবং ডুপ্ট কমান্ড প্রয়োগ করার আগে কেউ পুরো ডেটার পরিবর্তে কয়েকটি ভেরিয়েবলের নমুনা নিতে চাইতে পারে।

    # sample two variables without replacement
> anonymize(sample.df(dt,5,vars=c("Y","X")))
   Y    X
1 a1 -0.4
2 a1  0.6
3 a2 -2.4
4 a1 -1.4
5 a2  3.6

102

উদাহরণস্বরূপ আপনার প্রায়শই কিছু তথ্য প্রয়োজন হয় তবে আপনি আপনার সঠিক তথ্য পোস্ট করতে চান না। প্রতিষ্ঠিত লাইব্রেরিতে বিদ্যমান কিছু ডেটা.ফ্রেম ব্যবহার করতে, এটি আমদানি করতে ডেটা কমান্ড ব্যবহার করুন।

যেমন,

data(mtcars)

এবং তারপরে সমস্যাটি করুন

names(mtcars)
your problem demostrated on the mtcars data set

13
অনেকগুলি অন্তর্নির্মিত ডেটা সেটগুলি (জনপ্রিয় mtcarsএবং irisডেটাসেটের মতো) আসলে dataকলটি ব্যবহার করার দরকার নেই need
গ্রেগর থমাস

92

আপনার কাছে যদি বড় ডেটাসেট থাকে যা সহজে স্ক্রিপ্টের সাহায্যে ব্যবহার করা যায় না dput(), আপনার ডেটা পেস্টবিনে পোস্ট করুন এবং সেগুলি ব্যবহার করে লোড করুন read.table:

d <- read.table("http://pastebin.com/raw.php?i=m1ZJuKLH")

@ হেনরিক দ্বারা অনুপ্রাণিত ।


90

আমি দ্রুত প্রজননযোগ্য ডেটা ভাগ করার জন্য এই প্রয়োজনটিকে মোকাবেলার জন্য ওয়েগফিল্ড প্যাকেজটি বিকাশ করছি , কখনও কখনও dputছোট ডেটা সেটগুলির জন্য সূক্ষ্ম কাজ করে তবে আমরা যে সমস্যার মুখোমুখি হয়েছি তার অনেকগুলিই অনেক বড়, এর মাধ্যমে dputএত বড় ডেটা সেট ভাগ করা অবৈধ।

সম্পর্কিত:

ওয়েকফিল্ড ব্যবহারকারীকে ডেটা পুনরুত্পাদন করতে ন্যূনতম কোড ভাগ করতে দেয়। ব্যবহারকারী সেটn(সারিগুলির সংখ্যা) নির্ধারণ করে এবং যে কোনও সংখ্যক প্রিসেট ভেরিয়েবল ফাংশন নির্দিষ্ট করে (বর্তমানে 70 রয়েছে) যা বাস্তবের নকল করে যদি ডেটা (লিঙ্গ, বয়স, আয় ইত্যাদির মতো জিনিস)

স্থাপন:

বর্তমানে (2015-06-11), ওয়েকফিল্ড একটি গিটহাব প্যাকেজ তবে ইউনিট পরীক্ষাগুলি লেখার পরে অবশেষে CRAN এ যাবে। দ্রুত ইনস্টল করতে, ব্যবহার করুন:

if (!require("pacman")) install.packages("pacman")
pacman::p_load_gh("trinker/wakefield")

উদাহরণ:

এখানে একটি উদাহরণ:

r_data_frame(
    n = 500,
    id,
    race,
    age,
    sex,
    hour,
    iq,
    height,
    died
)

এটি উত্পাদন করে:

    ID  Race Age    Sex     Hour  IQ Height  Died
1  001 White  33   Male 00:00:00 104     74  TRUE
2  002 White  24   Male 00:00:00  78     69 FALSE
3  003 Asian  34 Female 00:00:00 113     66  TRUE
4  004 White  22   Male 00:00:00 124     73  TRUE
5  005 White  25 Female 00:00:00  95     72  TRUE
6  006 White  26 Female 00:00:00 104     69  TRUE
7  007 Black  30 Female 00:00:00 111     71 FALSE
8  008 Black  29 Female 00:00:00 100     64  TRUE
9  009 Asian  25   Male 00:30:00 106     70 FALSE
10 010 White  27   Male 00:30:00 121     68 FALSE
.. ...   ... ...    ...      ... ...    ...   ...

72

factorআপনার ডেটাতে যদি আপনার এক বা একাধিক পরিবর্তনশীল (গুলি) থাকে dput(head(mydata))তবে droplevelsআপনি এটি যুক্ত করার বিষয়টি বিবেচনা করুন , যাতে ন্যূনতম ডেটা সেটে উপস্থিত না থাকা উপাদানগুলির স্তরগুলি আপনার dputআউটপুটে অন্তর্ভুক্ত না হয় , যাতে উদাহরণটি ন্যূনতম করুন :

dput(droplevels(head(mydata)))

65

আমি ভাবছি যদি কোনও http://old.r-food.org/ লিঙ্ক কোনও সমস্যা ভাগ করে নেওয়ার জন্য খুব ঝরঝরে উপায় হতে পারে। এটি এর মতো একটি অনন্য আইডি পেয়ে থাকে এবং কেউ এটিকে এমও এম্বেড করার বিষয়ে ভাবতেও পারে।


47

দয়া করে আপনার কনসোল আউটপুটগুলি এই জাতীয়ভাবে পেস্ট করবেন না:

If I have a matrix x as follows:
> x <- matrix(1:8, nrow=4, ncol=2,
            dimnames=list(c("A","B","C","D"), c("x","y")))
> x
  x y
A 1 5
B 2 6
C 3 7
D 4 8
>

How can I turn it into a dataframe with 8 rows, and three
columns named `row`, `col`, and `value`, which have the
dimension names as the values of `row` and `col`, like this:
> x.df
    row col value
1    A   x      1
...
(To which the answer might be:
> x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
+                varying=list(colnames(x)), times=colnames(x),
+                v.names="value", timevar="col", idvar="row")
)

আমরা এটিকে সরাসরি অনুলিপি করতে পারি না।

প্রশ্ন ও উত্তর সঠিকভাবে পুনরায় উত্পাদন করা, মুছে ফেলার জন্য চেষ্টা +>এটা পোস্ট করার আগে এবং করা #আউটপুট এবং এই মত মন্তব্যের জন্য:

#If I have a matrix x as follows:
x <- matrix(1:8, nrow=4, ncol=2,
            dimnames=list(c("A","B","C","D"), c("x","y")))
x
#  x y
#A 1 5
#B 2 6
#C 3 7
#D 4 8

# How can I turn it into a dataframe with 8 rows, and three
# columns named `row`, `col`, and `value`, which have the
# dimension names as the values of `row` and `col`, like this:

#x.df
#    row col value
#1    A   x      1
#...
#To which the answer might be:

x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
                varying=list(colnames(x)), times=colnames(x),
                v.names="value", timevar="col", idvar="row")

আরও একটি বিষয়, আপনি যদি নির্দিষ্ট প্যাকেজ থেকে কোনও ফাংশন ব্যবহার করেন তবে সেই লাইব্রেরির উল্লেখ করুন।


2
আপনি কি সরান >এবং #ম্যানুয়ালি যোগ করুন বা এটি করার কোনও স্বয়ংক্রিয় উপায় আছে?
বিসিআরজি

3
@ বিসিআরজি আমি >ম্যানুয়ালি অপসারণ করেছি । তবে, সংযোজনের জন্য #আমি সম্পাদকে Ctrl+Shift+Cশর্টকাট ব্যবহার করি RStudio
ব্যবহারকারী 2100721

33

আপনি Depx ব্যবহার করে এটি করতে পারেন ।

যেমনটি এমটি 1022 উল্লেখ করেছে , "... ন্যূনতম, পুনরুত্পাদনযোগ্য উদাহরণ উত্পাদন করার জন্য ভাল প্যাকেজটি হল " টিডিয়াইভার্স থেকে " রেসেক্স "।

পরিদর্শনের মতে :

"ডিপেক্স" এর লক্ষ্যটি হল আপনার সমস্যাযুক্ত কোডটি এমনভাবে প্যাকেজ করা যাতে অন্যান্য লোকেরা এটি চালাতে পারে এবং আপনার ব্যথা অনুভব করতে পারে।

পরিপাটি ওয়েব সাইটে একটি উদাহরণ দেওয়া হয়েছে ।

library(reprex)
y <- 1:4
mean(y)
reprex() 

আমি মনে করি এটি পুনরুত্পাদনযোগ্য উদাহরণ তৈরি করার সহজতম উপায়


33

উপরের সমস্ত উত্তর যা আমি খুব আকর্ষণীয় পেয়েছি তা বাদ দিয়ে, এটি এখানে আলোচনা করা হিসাবে এটি কখনও কখনও খুব সহজ হতে পারে: - কীভাবে একটি ন্যূনতম প্রজননযোগ্য উদাহরণটি আর এর সাহায্যে পাওয়া যায়?

এলোমেলো ভেক্টর তৈরির অনেকগুলি উপায় রয়েছে আর এ এলোমেলো মান সহ 100 টি সংখ্যক ভেক্টর তৈরি করুন 2 টি ডেসিমাল বা আর এলোমেলো ম্যাট্রিক্স

mydf1<- matrix(rnorm(20),nrow=20,ncol=5)

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

class(mydf1)
# this shows the type of the data you have 
dim(mydf1)
# this shows the dimension of your data

তদ্ব্যতীত, একজনের ডেটাগুলির ধরন, দৈর্ঘ্য এবং বৈশিষ্ট্যগুলি জানা উচিত যা ডেটা স্ট্রাকচার হতে পারে

#found based on the following 
typeof(mydf1), what it is.
length(mydf1), how many elements it contains.
attributes(mydf1), additional arbitrary metadata.

#If you cannot share your original data, you can str it and give an idea about the structure of your data
head(str(mydf1))

28

এখানে আমার কিছু পরামর্শ দেওয়া হল:

  • ডিফল্ট আর ডেটাসেট ব্যবহার করার চেষ্টা করুন
  • যদি আপনার নিজস্ব ডেটাসেট থাকে তবে সেগুলি অন্তর্ভুক্ত করুন dput, যাতে অন্যরা আপনাকে আরও সহজে সহায়তা করতে পারে
  • install.package()এটি সত্যিই প্রয়োজনীয় না হলে ব্যবহার করবেন না , লোকেরা বুঝতে পারবেন আপনি যদি কেবল ব্যবহার করেন requireবা করেনlibrary
  • সংক্ষিপ্ত হওয়ার চেষ্টা করুন,

    • কিছু ডেটাসেট আছে
    • যতটা সম্ভব আপনার আউটপুটটি বর্ণনা করার চেষ্টা করুন
    • প্রশ্ন জিজ্ঞাসার আগে এটি নিজেই করুন
  • কোনও চিত্র আপলোড করা সহজ, তাই আপনার যদি প্লট থাকে তবে আপলোড করুন
  • আপনার যে কোনও ত্রুটি থাকতে পারে তা অন্তর্ভুক্ত করুন

এগুলি একটি পুনরুত্পাদনযোগ্য উদাহরণের অংশ।


1
আপনি এখানে আসলে পদার্থের কিছু যোগ করেন নি। dput()পূর্বে উল্লেখ করা হয়েছে, এবং এর বেশিরভাগটি কেবল স্ট্যান্ডার্ড এসও নির্দেশিকাগুলির পুনরাবৃত্তি করছে।
রিচ স্ক্রিভেন

1
install.packageউদাহরণটিতে অন্তর্ভুক্ত ফাংশনে আমার সমস্যা ছিল যা সত্যই প্রয়োজনীয় নয় (আমার মতে)। তদ্ব্যতীত, ডিফল্ট আর ডেটাসেট ব্যবহার করা পুনরুত্পাদনযোগ্য সহজ করে তুলবে। এসও নির্দেশিকাগুলি এই বিষয়গুলি সম্পর্কে বিশেষভাবে কোনও কথা বলেনি। আরও, এটি আমার মতামত দেওয়ার জন্যই বোঝানো হয়েছিল এবং এগুলি হ'ল আমি সবচেয়ে বেশি মুখোমুখি হয়েছি।
TheRimalaya

18

testthatআপনি কী ঘটবেন বলে প্রত্যাশা করার জন্য প্যাকেজ থেকে ফাংশনগুলি ব্যবহার করা ভাল ধারণা । সুতরাং, অন্য ব্যক্তিরা আপনার কোডটি ত্রুটি ছাড়াই চালানো পর্যন্ত পরিবর্তন করতে পারে। এটি যারা আপনাকে সহায়তা করতে চায় তাদের বোঝা হ্রাস করে, কারণ এর অর্থ তাদের আপনার পাঠ্য বিবরণ ডিকোড করতে হবে না। উদাহরণ স্বরূপ

library(testthat)
# code defining x and y
if (y >= 10) {
    expect_equal(x, 1.23)
} else {
    expect_equal(x, 3.21)
}

"আমার মতে x 10 এর সমান বা তার বেশি হওয়ার জন্য x এর পরিমাণ 1.23 হতে প্রকাশিত হবে এবং অন্যথায় 3.21, তবে আমার কোনও ফল পাওয়া যায় নি" than এমনকি এই নির্বোধ উদাহরণেও আমি মনে করি কোডটি শব্দের চেয়ে পরিষ্কার। ব্যবহারের testthatসাহায্যে আপনার সহায়ককে কোডটি ফোকাস করতে দেয় যা সময় সাশ্রয় করে এবং এটি পোস্ট করার আগে তারা তাদের সমস্যাটি সমাধান করেছে তা জানার একটি উপায় সরবরাহ করে they

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