كيفية عمل مثال R رائعة قابلة للتكرار




r-faq (16)

القواعد الارشادية:

يجب أن يكون هدفك الرئيسي في صياغة أسئلتك هو جعل الأمر أسهل ما يمكن للقراء من فهم مشكلتك وإعادة إنتاجها على أنظمتهم. لنفعل ذلك:

  1. توفير بيانات الإدخال
  2. توفير الانتاج المتوقع
  3. اشرح مشكلتك بإيجاز
    • إذا كان لديك أكثر من 20 سطر من النص + رمز ، فربما يمكنك الرجوع إليها وتبسيطها
    • تبسيط التعليمات البرمجية قدر الإمكان مع الحفاظ على المشكلة / الخطأ

هذا يتطلب بعض العمل ولكن يبدو وكأنه مقايضة عادلة لأنك تطلب من الآخرين القيام بالعمل نيابة عنك.

توفير البيانات:

مجموعات البيانات المضمنة

أفضل خيار حتى الآن هو الاعتماد على مجموعات البيانات المدمجة. هذا يجعل من السهل على الآخرين العمل على مشكلتك. اكتب data() في موجه R لمعرفة البيانات المتوفرة لك. بعض الأمثلة الكلاسيكية:

  • iris
  • mtcars
  • ggplot2::diamonds (حزمة الخارجي ، ولكن الجميع تقريبا لديها)

انظر هذا QA SO عن كيفية العثور على مجموعات البيانات المناسبة لمشكلتك.

إذا كنت قادرًا على إعادة صياغة مشكلتك لاستخدام مجموعات البيانات المدمجة ، فمن المرجح أن تحصل على إجابات جيدة (و upvotes).

البيانات المولدة ذاتيا

إذا كانت مشكلتك محددة جدًا لنوع من البيانات غير الممثلة في مجموعات البيانات الموجودة ، فقدم رمز R الذي ينشئ أصغر مجموعة بيانات ممكنة تتجلى بها مشكلتك. فمثلا

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 لتحويل كائن بيانات إلى رمز R (مثل dput(myData) ). أقول "كملاذ أخير" لأن ناتج الإنتاج غالبا ما يكون غير عملي ، ومزعج للنسخ واللصق ، ويحجب باقي سؤالك.

توفير الناتج المتوقع:

قال أحدهم ذات مرة:

صورة الناتج المتوقع تساوي 1000 كلمة

- شخص حكيم جدا

إذا كان بإمكانك إضافة شيء مثل "توقعت الحصول على هذه النتيجة":

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

لسؤالك ، من المرجح أن يفهم الناس بسرعة ما تحاول القيام به. إذا كانت نتيجتك المتوقعة كبيرة وغير عملية ، فمن المحتمل أنك لم تفكر بما يكفي لتبسيط مشكلتك (انظر التالي).

اشرح مشكلتك بإيجاز

الشيء الرئيسي الذي ينبغي عليك فعله هو تبسيط مشكلتك قدر الإمكان قبل أن تطرح سؤالك. إعادة صياغة المشكلة للعمل مع مجموعات البيانات المضمنة سيساعد كثيرا في هذا الصدد. سوف تجد في كثير من الأحيان أنه بمجرد المرور بعملية التبسيط سوف تجيب على مشكلتك.

فيما يلي بعض الأمثلة على الأسئلة الجيدة:

في كلتا الحالتين ، من شبه المؤكد أن مشاكل المستخدم ليست مع الأمثلة البسيطة التي يقدمونها. بالأحرى قاموا بتجريد طبيعة مشكلتهم وتطبيقها على مجموعة بيانات بسيطة لطرح سؤالهم.

لماذا جواب آخر لهذه المسألة؟

تركز هذه الإجابة على ما أعتقد أنه أفضل الممارسات: استخدام مجموعات البيانات المضمنة وتقديم ما تتوقعه في الحد الأدنى من الشكل. تركز أبرز الإجابات على جوانب أخرى. لا أتوقع أن يرتفع هذا الجواب إلى أي مكان بارز ؛ هذا هنا فقط حتى أتمكن من الربط به في التعليقات على أسئلة مبتدئ.

عند مناقشة الأداء مع الزملاء ، أو التدريس ، أو إرسال تقرير خطأ ، أو البحث عن إرشادات على القوائم البريدية ، وهنا على Stack Overflow ، غالبًا ما يتم طلب مثال قابل للتكرار ومفيد دائمًا.

ما هي نصائحك لإنشاء مثال ممتاز؟ كيف تقوم بلصق هياكل البيانات من r بتنسيق نصي؟ ما هي المعلومات الأخرى التي يجب عليك تضمينها؟

هل هناك حيل أخرى بالإضافة إلى استخدام dput() أو dump() أو structure() ؟ متى يجب عليك تضمين library() أو require() ؟ ما هي الكلمات المحجوزة التي يجب تجنبها ، بالإضافة إلى c ، df ، data ، وما إلى ذلك؟

كيف يمكن للمرء أن يصنع مثالا رائعا؟


(هنا نصيحتي من كيفية كتابة مثال استنساخه . لقد حاولت أن أجعلها قصيرة ولكنها حلوة)

كيفية كتابة مثال استنساخه.

من المرجح أن تحصل على مساعدة جيدة في مشكلة R إذا قدمت مثالًا قابلًا للتكرار. يسمح أحد الأمثلة القابلة للتكرار لشخص آخر بإعادة إنشاء مشكلتك بمجرد نسخ رمز R ولصقه.

هناك أربعة أشياء تحتاج إلى تضمينها لجعل المثال الخاص بك reproducible: الحزم المطلوبة ، والبيانات ، والتعليمات البرمجية ، ووصف لبيئة R الخاصة بك.

  • يجب تحميل الحزم في الجزء العلوي من البرنامج النصي ، لذلك من السهل معرفة أيها يحتاج المثال.

  • إن أسهل طريقة لتضمين البيانات في بريد إلكتروني أو سؤال هي استخدام dput() لإنشاء رمز R لإعادة إنشاءه. على سبيل المثال ، لإعادة إنشاء مجموعة بيانات mtcars في R ، أقوم بتنفيذ الخطوات التالية:

    1. تشغيل dput(mtcars) في R
    2. انسخ المخرجات
    3. في mtcars <- reproducible ، اكتب mtcars <- ثم الصق.
  • قضاء بعض الوقت في ضمان سهولة قراءة الشفرة على الآخرين:

    • تأكد من أنك استخدمت مسافات وأسماء المتغيرات الخاصة بك موجزة ، ولكنها غنية بالمعلومات

    • استخدم التعليقات للإشارة إلى أين تكمن مشكلتك

    • بذل قصارى جهدك لإزالة كل ما لا يتعلق بالمشكلة.
      كلما كان كودك أقصر ، كان من الأسهل فهمه.

  • قم بتضمين إخراج sessionInfo() في تعليق في التعليمات البرمجية. يلخص هذا بيئة R الخاصة بك ويسهل التحقق مما إذا كنت تستخدم حزمة قديمة.

يمكنك التحقق من أنك قد قدمت بالفعل مثالًا قابلاً للتكرار عن طريق بدء جلسة R جديدة ولصق النص البرمجي فيها.

قبل وضع كل رمزك في بريد إلكتروني ، فكّر في وضعه على Gist github . سيعطي الكود الخاص بك تسليط الضوء على بناء جملة لطيفة ، وليس لديك ما يدعو للقلق حول أي شيء الحصول على mangled بواسطة نظام البريد الإلكتروني.


أقوم بتطوير حزمة wakefield لمعالجة هذه الحاجة لمشاركة البيانات dput للاستنساخ بسرعة ، وأحيانًا يكون العمل dput لمجموعات البيانات الأصغر لكن العديد من المشكلات التي نتعامل معها أكبر بكثير ، ومشاركة مثل هذه المجموعة الكبيرة من البيانات عبر dput غير عملي.

حول:

يتيح برنامج تيفيلد للمستخدم مشاركة الحد الأدنى من الكود لإعادة إنتاج البيانات. يقوم المستخدم بتعيين n (عدد الصفوف) ويحدد أي عدد من وظائف المتغير المعينة مسبقًا (يوجد حاليًا 70) والتي تحاكي الحقيقي إذا كانت البيانات (أشياء مثل الجنس والعمر والدخل وما إلى ذلك)

التركيب:

حالياً (2015-06-11) ، فإن wakefield عبارة عن حزمة GitHub ، ولكنها سوف تذهب إلى 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
.. ...   ... ...    ...      ... ...    ...   ...

أنا شخصياً أفضل الخطوط "الواحدة". شيء على طول الخطوط:

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)

يجب أن يحاكي بنية البيانات فكرة مشكلة الكاتب وليس بنية الحرفية الدقيقة. أنا أقدر ذلك عندما لا تقوم المتغيرات بالكتابة فوق المتغيرات الخاصة بي أو لا سمح الله ، الوظائف (مثل 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 shapefile) في الحزم "المكانية" (انظر العرض المكاني في طرق عرض المهام).

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

إذا كان لديك مجموعة بيانات كبيرة لا يمكن وضعها بسهولة في البرنامج النصي باستخدام dput() ، read.table بنشر بياناتك إلى pastebin وقم read.table باستخدام read.table :

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

مستوحاة من @Henrik .


التعليمات البرمجية القابلة للتكرار هي المفتاح للحصول على المساعدة. ومع ذلك ، هناك العديد من المستخدمين الذين قد يكونون متشككين في لصق حتى جزء من بياناتهم. على سبيل المثال ، يمكن أن يعملوا مع البيانات الحساسة أو على البيانات الأصلية التي تم جمعها لاستخدامها في ورقة بحثية. ولأي سبب من الأسباب ، اعتقدت أنه سيكون من الجيد أن يكون لديك وظيفة مفيدة "لتشويه" بياناتي قبل لصقها علنًا. وظيفة anonymize من حزمة SciencePo سخيفة للغاية ، ولكن بالنسبة لي تعمل بشكل جيد مع وظيفة 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

قد يرغب المرء أيضًا في تجريب عدد قليل من المتغيرات بدلاً من البيانات بالكامل قبل تطبيق أمر إخفاء الهوية وأمر dput.

    # 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

غالبًا ما تحتاج إلى بعض البيانات على سبيل المثال ، ولكنك لا تريد نشر بياناتك بالضبط. لاستخدام بعض data.frame الموجود في مكتبة ثابتة ، استخدم أمر البيانات لاستيراده.

على سبيل المثال،

data(mtcars)

ثم نفذ المشكلة

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

في بعض الأحيان ، لا تكون المشكلة في الواقع قابلة للتكرار باستخدام جزء صغير من البيانات ، بغض النظر عن مدى صعوبة المحاولة ، ولا يحدث مع البيانات الاصطناعية (على الرغم من أنه من المفيد إظهار كيفية إنتاج مجموعات البيانات الاصطناعية التي لم تعيد إنتاج المشكلة ، لأن تستبعد بعض الفرضيات).

  • قد يكون من الضروري نشر البيانات على الويب في مكان ما وتوفير عنوان URL.
  • إذا تعذر نشر البيانات للجمهور بشكل عام ولكن يمكن مشاركتها على الإطلاق ، فقد تتمكن من إرسالها بالبريد الإلكتروني إلى الأطراف المعنية (على الرغم من أن هذا سيقلل عدد الأشخاص الذين سيهتمون بالعمل عليه).
  • لم أشاهد هذا بالفعل ، لأن الأشخاص الذين لا يستطيعون نشر بياناتهم لديهم حساسية تجاه إصداره بأي شكل من الأشكال ، ولكن يبدو من المعقول أنه في بعض الحالات يمكن للمرء أن ينشر البيانات إذا كان مجهولاً بشكل كافي / مخلوط / تالف قليلاً بطريقة ما.

إذا كنت لا تستطيع القيام بأي من هذين ، فربما تحتاج إلى توظيف خبير استشاري لحل مشكلتك ...

تحرير : اثنان من الأسئلة SO المفيدة لإخفاء الهوية / الهرولة:


لدي طريقة سهلة وفعالة للغاية لتقديم مثال R الذي لم يتم ذكره أعلاه. يمكنك تحديد الهيكل الخاص بك أولا. فمثلا،

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

>fix(mydata)

ثم يمكنك إدخال بياناتك يدويًا. هذا فعال لأمثلة صغيرة بدلاً من الكبيرة.


مستوحاة من هذا المنصب ، أنا الآن استخدم وظيفة يدوية
reproduce(<mydata>) عندما أحتاج إلى النشر إلى .

تعليمات سريعة

إذا كان myData هو اسم الكائن الخاص بك لإعادة إنتاج ، قم بتشغيل ما يلي في R:

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

reproduce(myData)

تفاصيل:

هذه الوظيفة عبارة عن غلاف ذكي dput ويقوم بما يلي:

  • تلقائيا عينات مجموعة كبيرة من البيانات (على أساس الحجم والفئة. يمكن تعديل حجم العينة)
  • يخلق خرج الإخراج
  • يسمح لك بتحديد الأعمدة التي سيتم تصديرها
  • objName <- ... إلى الجزء الأمامي منه objName <- ... بحيث يمكن نسخها بسهولة + لصق ، ولكن ...
  • إذا كنت تعمل على جهاز Mac ، فسيتم نسخ المخرجات تلقائيًا إلى الحافظة ، بحيث يمكنك ببساطة تشغيلها ثم لصقها على سؤالك.

المصدر متاح هنا:

مثال:

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

DF حوالي 100 × 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==

لاحظ أيضًا أن الناتج بالكامل في سطر واحد مفرد طويل ، وليس فقرة طويلة من الخطوط المقطوعة. هذا يجعل من الأسهل للقراءة على المشاركات الأسئلة SO وأيضا أسهل في نسخ لصق.

تحديث أكتوبر 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==

منذ R.2.14 (أظن) يمكنك تغذية تمثيل نص البيانات الخاصة بك مباشرة إلى read.table:

df <- read.table(header=T, 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
") 

هنا هو دليل جيد:

http://www.r-bloggers.com/three-tips-for-posting-good-questions-to-r-help-and-stack-overflow/

ولكن الأهم هو: فقط تأكد من أنك تقوم بعمل جزء صغير من التعليمات البرمجية يمكننا تشغيله لمعرفة ما هي المشكلة. وظيفة مفيدة لهذا هو dput() ، ولكن إذا كان لديك بيانات كبيرة جدًا ، فقد ترغب في إنشاء مجموعة بيانات نموذجية صغيرة أو استخدام أول 10 أسطر فقط.

تصحيح:

تأكد أيضًا من تحديد مكان المشكلة بنفسك. يجب ألا يكون المثال عبارة عن برنامج نصي كامل يحتوي على "On line 200 there is a error". إذا كنت تستخدم أدوات تصحيح الأخطاء في R (أنا أحب browser() ) و google ، فيجب أن تكون قادرًا على تحديد مكان المشكلة بالفعل وإعادة إنتاج مثال تافه يحدث فيه نفس الشيء.


إليك بعض اقتراحاتي:

  • حاول استخدام مجموعات بيانات R الافتراضية
  • إذا كان لديك مجموعة بيانات خاصة بك ، قم بتضمينها dput، حتى يتمكن الآخرون من مساعدتك بسهولة أكبر
  • لا تستخدم install.package()إلا إذا كان ضروريًا حقًا ، سيفهم الناس ما إذا كنت تستخدم فقط requireأوlibrary
  • حاول أن تكون مختصرا ،

    • لديك بعض مجموعة البيانات
    • حاول وصف الناتج الذي تحتاجه ببساطة قدر الإمكان
    • افعل ذلك بنفسك قبل طرح السؤال
  • من السهل تحميل صورة ، لذلك قم بتحميل المؤامرات إذا كان لديك
  • وتشمل أيضا أي أخطاء قد تكون لديكم

كل هذه هي جزء من مثال استنساخه.


يرجى عدم لصق مخرجات وحدة التحكم الخاصة بك مثل هذا:

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")

شيء آخر ، إذا كنت قد استخدمت أي وظيفة من حزمة معينة ، ذكر تلك المكتبة.


وبصرف النظر عن جميع الإجابات المذكورة أعلاه التي وجدتها مشوقة للغاية ، يمكن أن تكون سهلة للغاية في بعض الأحيان حيث نوقشت هنا: - كيف نجعل مثالا قابلا للتكدر للحصول على المساعدة مع R

هناك العديد من الطرق لإنشاء متجه عشوائي إنشاء متجه رقم 100 مع قيم عشوائية في R تقريبًا إلى عشريين أو مصفوفة عشوائية في R

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

لاحظ أنه في بعض الأحيان يكون من الصعب جدًا مشاركة بيانات معينة بسبب العديد من الأسباب مثل البعد وما إلى ذلك. ومع ذلك ، فإن جميع الإجابات المذكورة أعلاه كبيرة ومهمة للغاية للتفكير والاستعمال عندما يريد المرء تقديم مثال على البيانات القابلة للاستنساخ. ولكن تجدر الإشارة إلى أنه من أجل جعل البيانات ممثلة للأصل (في حالة عدم تمكن OP من مشاركة البيانات الأصلية) ، فمن الجيد إضافة بعض المعلومات مع مثال البيانات (إذا اتصلنا بالبيانات mydf1)

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))

يمكنك القيام بذلك باستخدام github.com/tidyverse/reprex .

كما لاحظت mt1022 ، "... حزمة جيدة لإنتاج الحد الأدنى ، على سبيل المثال reproducible " reprex " من tidyverse ".

وفقا ل Tidyverse :

الهدف من "reprex" هو حزم رمز المشكلة الخاص بك بطريقة يمكن للأشخاص الآخرين تشغيلها وتشعر بألمك.

ويرد مثال على موقع ويب tidyverse .

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

أعتقد أن هذا هو أبسط طريقة لإنشاء مثال مستنسخ.





r-faq