Tekrarlanabilir harika bir R örneği nasıl yapılır

May 11 2011

İş arkadaşlarıyla performansı tartışırken, öğretirken, bir hata raporu gönderirken veya posta listelerinde ve burada Stack Overflow'da rehberlik ararken sıklıkla tekrarlanabilir bir örnek sorulur ve her zaman faydalıdır.

Mükemmel bir örnek oluşturmak için ipuçlarınız nelerdir? Nasıl gelen veri yapılarını yapıştırırım r bir metin biçiminde? Başka hangi bilgileri eklemelisiniz?

Ek olarak orada diğer hileler kullanarak misiniz dput(), dump()yoksa structure()? Ne zaman içermelidir library()veya require()ifadeler? Hangi kelimeleri saklıdır gerektiği bir kaçının, ek olarak c, df, datavb?

İnsan nasıl büyük yapar r tekrarlanabilir örnek?

Yanıtlar

1756 JorisMeys May 11 2011 at 18:40

Bir asgari tekrarlanabilir örnek aşağıdaki öğelerden oluşur:

  • sorunu göstermek için gerekli olan minimum bir veri kümesi
  • Hatayı yeniden üretmek için gereken minimum çalıştırılabilir kod, verilen veri kümesinde çalıştırılabilir
  • kullanılan paketler, R sürümü ve çalıştırıldığı sistem hakkında gerekli bilgiler.
  • rastgele süreçler durumunda, set.seed()yeniden üretilebilirlik için bir tohum (belirleyen ) 1

En az yeniden üretilebilir örneklerin örnekleri için , kullandığınız işlevin yardım dosyalarına bakın. Genel olarak, burada verilen tüm kod, minimum yeniden üretilebilir örneğin gereksinimlerini karşılar: veri sağlanır, minimum kod sağlanır ve her şey çalıştırılabilir. Ayrıca çok sayıda olumlu oy içeren Stack Overflow'daki sorulara da bakın.

Minimal bir veri kümesi üretmek

Çoğu durumda, bu sadece bazı değerlere sahip bir vektör / veri çerçevesi sağlayarak kolayca yapılabilir. Veya çoğu paketle birlikte sağlanan yerleşik veri kümelerinden birini kullanabilirsiniz.
Yerleşik veri kümelerinin kapsamlı bir listesi ile görülebilir library(help = "datasets"). Her veri kümesinin kısa bir açıklaması vardır ve daha fazla bilgi, örneğin ?mtcars'mtcars'ın listedeki veri kümelerinden biri olduğu durumlarda elde edilebilir . Diğer paketler ek veri kümeleri içerebilir.

Bir vektör yapmak kolaydır. Bazen ona biraz rastgelelik eklemek gerekir ve bunu yapmak için çok sayıda işlev vardır. sample()bir vektörü rasgele seçebilir veya yalnızca birkaç değeri olan rastgele bir vektör verebilir. lettersalfabeyi içeren kullanışlı bir vektördür. Bu, faktör yapmak için kullanılabilir.

Birkaç örnek:

  • rastgele değerler: x <- rnorm(10)normal dağılım x <- runif(10)için, düzgün dağılım için, ...
  • bazı değerlerin permütasyonu: x <- sample(1:10)rastgele sırayla vektör 1:10 için.
  • rastgele bir faktör: x <- sample(letters[1:4], 20, replace = TRUE)

Matrisler için matrix()örneğin:

matrix(1:10, ncol = 2)

Veri çerçevelerinin oluşturulması kullanılarak yapılabilir data.frame(). Veri çerçevesindeki girişleri adlandırmaya ve aşırı karmaşık hale getirmemeye dikkat edilmelidir.

Bir örnek :

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

Bazı sorular için belirli formatlara ihtiyaç duyulabilir. Bu, bir sağlanan herhangi birini kullanabilirsiniz as.someType: fonksiyonlar as.factor, as.Date, as.xtsvektör ve / veya veri çerçevesi hileler ile birlikte, ... Bunlar.

Verilerinizi kopyalayın

Bu ipuçlarını kullanarak inşa etmek çok zor olacaktır bazı veriler varsa, o zaman her zaman kullanarak, orijinal verilerin bir alt kümesini yapabilir head(), subset()ya da endeksleri. O zaman dput()bize hemen R'ye eklenebilecek bir şey vermek için kullanın :

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

Veri çerçevenizde birçok seviyeye sahip bir faktör varsa, verilerinizin dputalt kümesinde bulunmasalar bile olası tüm faktör seviyelerini listeleyeceği için çıktı hantal olabilir. Bu sorunu çözmek için droplevels()işlevi kullanabilirsiniz . Aşağıda, türlerin nasıl yalnızca tek seviyeli bir faktör olduğuna dikkat edin:

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

Kullanırken dput, yalnızca ilgili sütunları da dahil etmek isteyebilirsiniz:

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

Diğer bir uyarı dput, anahtarlı data.tablenesneler için veya gruplanmış tbl_df(sınıf grouped_df) için çalışmayacağıdır dplyr. Bu durumlarda, paylaşmadan önce normal bir veri çerçevesine geri dönebilirsiniz dput(as.data.frame(my_data)).

En kötü durum senaryosu, textparametresi kullanılarak okunabilecek bir metin gösterimi verebilirsiniz 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)

Minimum kod üretmek

Bu işin kolay kısmı olmalı ama çoğu zaman değil. Yapmamanız gereken şey:

  • her türlü veri dönüşümünü ekleyin. Sağlanan verilerin zaten doğru biçimde olduğundan emin olun (tabii ki sorun bu değilse)
  • hata veren tüm bir işlevi / kod parçasını kopyalayıp yapıştırın. İlk olarak, hangi satırların tam olarak hatayla sonuçlandığını bulmaya çalışın. Çoğu zaman sorunun ne olduğunu kendiniz keşfedeceksiniz.

Yapmanız gereken şudur:

  • herhangi birini kullanırsanız hangi paketleri kullanmanız gerektiğini ekleyin (kullanıyor library())
  • Bağlantıları açarsanız veya dosya oluşturursanız, kapatmak için bazı kodlar ekleyin veya dosyaları silin (kullanarak unlink())
  • Seçenekleri değiştirirseniz, kodun orijinal olanlara geri döndürmek için bir ifade içerdiğinden emin olun. (örneğin op <- par(mfrow=c(1,2)) ...some code... par(op))
  • kodun çalıştırılabilir olduğundan emin olmak için kodunuzu yeni, boş bir R oturumunda çalıştırın. İnsanlar, verilerinizi ve kodunuzu konsola kopyalayıp yapıştırabilmeli ve sahip olduğunuz gibi tam olarak aynı şeyi alabilmelidir.

Ekstra bilgi verin

Çoğu durumda, sadece R sürümü ve işletim sistemi yeterli olacaktır. Paketlerle çatışmalar ortaya çıktığında, çıktılarını vermek sessionInfo()gerçekten yardımcı olabilir. Diğer uygulamalarla bağlantılardan bahsederken (ODBC veya başka herhangi bir şey), bunlar için sürüm numaralarını ve mümkünse kurulumla ilgili gerekli bilgileri de sağlamalıdır.

İçinde R çalıştırıyorsanız R Studio kullanarak rstudioapi::versionInfo()sizin RStudio sürümünü bildirmek için yararlı olabilir.

Belirli bir paketle ilgili bir sorununuz varsa, çıktısını vererek paketin sürümünü sağlamak isteyebilirsiniz packageVersion("name of the package").


1 Not: Çıktı set.seed()R> 3.6.0 ve önceki sürümler arasında farklılık gösterir. Rastgele süreç için hangi R sürümünü kullandığınızı belirtin ve eski soruları takip ederken biraz farklı sonuçlar alırsanız şaşırmayın. Bu gibi durumlarda aynı sonucu almak için, daha RNGversion()önce -fonksiyonunu kullanabilirsiniz set.seed()(örneğin :) RNGversion("3.5.2").

595 hadley May 11 2011 at 20:57

( Tekrarlanabilir bir örnek nasıl yazılır bölümünden tavsiyem burada . Kısa ama tatlı yapmaya çalıştım)

Tekrarlanabilir bir örnek nasıl yazılır.

Tekrarlanabilir bir örnek sağlarsanız, R sorununuzla ilgili iyi bir yardım alma olasılığınız yüksektir. Tekrarlanabilir bir örnek, bir başkasının yalnızca R kodunu kopyalayıp yapıştırarak sorununuzu yeniden oluşturmasına olanak tanır.

Örneğinizi tekrarlanabilir hale getirmek için eklemeniz gereken dört şey vardır: gerekli paketler, veriler, kod ve R ortamınızın bir açıklaması.

  • Paketler komut dosyasının en üstüne yüklenmelidir, böylece örneğin hangilerine ihtiyaç duyduğunu görmek kolaydır.

  • Bir e-postaya veya Stack Overflow sorusuna veri eklemenin en kolay yolu, dput()onu yeniden oluşturmak için R kodunu oluşturmaktır. Örneğin, mtcarsveri kümesini R'de yeniden oluşturmak için aşağıdaki adımları gerçekleştirirdim:

    1. dput(mtcars)R koşmak
    2. Çıktıyı kopyalayın
    3. Yeniden üretilebilir komut dosyamda yazıp mtcars <-yapıştırın.
  • Kodunuzun başkalarının kolayca okuyabilmesi için biraz zaman ayırın :

    • boşluklar kullandığınızdan ve değişken adlarınızın kısa ama bilgilendirici olduğundan emin olun

    • Probleminizin nerede olduğunu belirtmek için yorumları kullanın

    • sorunla ilgili olmayan her şeyi kaldırmak için elinizden gelenin en iyisini yapın.
      Kodunuz ne kadar kısa olursa, anlaşılması o kadar kolay olur.

  • sessionInfo()Kodunuzun çıktısını bir yoruma ekleyin. Bu, R ortamınızı özetler ve güncel olmayan bir paket kullanıp kullanmadığınızı kontrol etmeyi kolaylaştırır.

Yeni bir R oturumu başlatıp betiğinizi içine yapıştırarak gerçekten yeniden üretilebilir bir örnek oluşturup oluşturmadığınızı kontrol edebilirsiniz.

Tüm kodunuzu bir e-postaya koymadan önce, onu Gist github'a koymayı düşünün . Kodunuza güzel sözdizimi vurgulaması sağlar ve e-posta sistemi tarafından karıştırılan herhangi bir şey için endişelenmenize gerek kalmaz.

307 RomanLuštrik May 11 2011 at 18:22

Şahsen ben "tek" gömlekleri tercih ederim. Çizgiler boyunca bir şey:

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)

Veri yapısı, harfi harfine tam yapıyı değil, yazarın problemi fikrini taklit etmelidir. Değişkenler kendi değişkenlerimin üzerine yazmadığında veya tanrı korusun, fonksiyonlar (gibi df) olduğunda gerçekten minnettarım .

Alternatif olarak, birkaç köşeyi kesip önceden var olan bir veri kümesine işaret edebilir, örneğin:

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

Kullanıyor olabileceğiniz özel paketlerden bahsetmeyi unutmayın.

Daha büyük nesneler üzerinde bir şey göstermeye çalışıyorsanız, deneyebilirsiniz.

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

rasterPaket aracılığıyla uzamsal verilerle çalışıyorsanız , bazı rastgele veriler üretebilirsiniz. Paket vinyetinde birçok örnek bulunabilir, ancak işte küçük bir külçe.

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)

İçinde uygulandığı gibi bir uzamsal nesneye ihtiyacınız varsa sp, "uzamsal" paketlerdeki harici dosyalar (ESRI şekil dosyası gibi) aracılığıyla bazı veri kümelerini alabilirsiniz (Görev Görünümlerindeki Uzamsal görünüme bakın).

library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")
281 RicardoSaporta May 14 2013 at 05:20

Bu gönderiden ilham alarak
reproduce(<mydata>)StackOverflow'a gönderi göndermem gerektiğinde artık kullanışlı bir işlev kullanıyorum .


HIZLI TALİMATLAR

Yeniden myDataüretilecek nesnenizin adı ise, aşağıdakileri R'de çalıştırın:

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

reproduce(myData)

Detaylar:

Bu işlev, dputaşağıdakileri yapmak için akıllı bir sarmalayıcıdır :

  • otomatik olarak büyük bir veri kümesini örnekler (boyut ve sınıfa göre. Örnek boyutu ayarlanabilir)
  • bir dputçıktı yaratır
  • hangi sütunların dışa aktarılacağını belirlemenize olanak tanır
  • objName <- ...kolayca kopyalayıp yapıştırılabilmesi için önüne eklenir, ancak ...
  • Bir mac üzerinde çalışıyorsanız, çıktı otomatik olarak panoya kopyalanır, böylece basitçe çalıştırabilir ve ardından sorunuza yapıştırabilirsiniz.

Kaynak burada mevcuttur:

  • GitHub - pubR / reproduce.R

Misal:

# 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 yaklaşık 100 x 102'dir. 10 satır ve birkaç belirli sütunu örneklemek istiyorum

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

Aşağıdaki çıktıyı verir:

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

Ayrıca çıktının tamamının, kesik çizgilerden oluşan uzun bir paragraf değil, güzel, tek, uzun bir satırda olduğuna dikkat edin. Bu, SO soru gönderilerini okumayı ve ayrıca kopyalayıp yapıştırmayı kolaylaştırır.


Ekim 2013 Güncellemesi:

Artık kaç satır metin çıktısının alacağını (yani, StackOverflow'a ne yapıştıracağınızı) belirtebilirsiniz. Bunun için lines.out=nargümanı kullanın . Misal:

reproduce(DF, cols=c(1:3, 17, 23), lines.out=7) verim:

    ==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==
198 SachaEpskamp May 11 2011 at 18:21

İşte iyi bir rehber .

En önemli nokta şudur: Sorunun ne olduğunu görmek için çalıştırabileceğimiz küçük bir kod parçası yaptığınızdan emin olun . Bunun için kullanışlı bir işlev dput(), ancak çok büyük veriye sahipseniz, küçük bir örnek veri kümesi oluşturmak veya yalnızca ilk 10 satırı kullanmak isteyebilirsiniz.

DÜZENLE:

Ayrıca sorunun nerede olduğunu kendiniz belirlediğinizden emin olun. Örnek, "200 satırında bir hata var" ile tam bir R betiği olmamalıdır. R (Seviyorum browser()) ve Google'daki hata ayıklama araçlarını kullanırsanız, sorunun nerede olduğunu gerçekten belirleyebilmeli ve aynı şeyin ters gittiği önemsiz bir örneği yeniden üretebilmelisiniz.

167 RichieCotton May 11 2011 at 20:17

R-help posta listesi, veri oluşturma örneği de dahil olmak üzere hem soru sormayı hem de yanıtlamayı kapsayan bir gönderme kılavuzuna sahiptir:

Örnekler: Bazen birinin gerçekten koşabileceği küçük bir örnek sağlamaya yardımcı olur. Örneğin:

Aşağıdaki gibi bir x matrisim varsa:

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

Bunu, 8 satır ve 'satır', 'sütun' ve 'değer' adlı üç sütuna sahip bir veri çerçevesine nasıl dönüştürebilirim ki, boyut adları 'satır' ve 'sütun' değerleri olarak şu şekildedir:

  > x.df
     row col value
  1    A   x      1

...
(Cevap şu olabilir:

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

)

Sözcük küçük özellikle önemlidir. Asgari tekrarlanabilir bir örneği hedeflemelisiniz , bu da verilerin ve kodun sorunu açıklamak için olabildiğince basit olması gerektiği anlamına gelir.

DÜZENLEME: Güzel kodu okumak, çirkin koddan daha kolaydır. Bir stil kılavuzu kullanın .

164 Paolo Jun 29 2012 at 15:32

R.2.14'ten bu yana (sanırım) veri metni sunumunuzu doğrudan şu adrese besleyebilirsiniz 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
") 
146 BenBolker Jul 15 2011 at 02:49

Bazen sorun gerçekten verilerin daha küçük bir parçası, kadar uğraşırsan uğraş hiçbir madde ile tekrarlanabilir değildir ve bunu vermedi sentetik veri setleri üretilen göstermek için yararlıdır rağmen (sentetik verilerle olmaz değil sorunu yeniden çünkü, bazı hipotezleri geçersiz kılar).

  • Verileri web'de bir yere göndermek ve bir URL sağlamak gerekli olabilir.
  • Veriler genel olarak kamuya açıklanamıyorsa ancak paylaşılabiliyorsa, ilgili taraflara e-posta ile göndermeyi teklif edebilirsiniz (bu, çalışmaktan rahatsız olacak kişilerin sayısını azaltacaktır. üstünde).
  • Bunun gerçekten yapıldığını görmedim, çünkü verilerini yayınlayamayan insanlar herhangi bir şekilde yayınlama konusunda hassaslar, ancak bazı durumlarda yeterince anonimleştirilmiş / karıştırılmış / biraz bozulmuşsa verileri yine de gönderebilirmiş gibi görünebilir. bir şekilde.

Bunlardan hiçbirini yapamazsanız, muhtemelen sorununuzu çözmek için bir danışman tutmanız gerekir ...

düzenleme : Anonimleştirme / karıştırma için iki yararlı SO sorusu:

  • Özel verilerden örnek veri kümesi nasıl oluşturulur (değişken adlarını ve düzeyleri bilgi vermeyen yer tutucularla değiştirerek)?
  • Sürekli tek değişkenli bir dağılımdan alınan bir dizi rastgele sayı verildiğinde, dağılımı bulun
136 AriB.Friedman Jul 09 2012 at 22:41

Şimdiye kadarki cevaplar açıkça tekrarlanabilirlik kısmı için harika. Bu, yalnızca tekrarlanabilir bir örneğin sorunun tek bileşeni olamayacağını ve olmaması gerektiğini açıklığa kavuşturmak içindir. Nasıl görünmesini istediğinizi ve probleminizin ana hatlarını açıklamayı unutmayın, sadece oraya nasıl ulaşmaya çalıştığınızı değil. Kod yeterli değil; kelimelere de ihtiyacın var.

İşte yapmaktan kaçınılması gerekenlerin tekrarlanabilir bir örneği (gerçek bir örnekten alınmıştır, masumları korumak için isimler değiştirilmiştir):


Aşağıdaki örnek veriler ve sorun yaşadığım işlevin bir parçasıdır.

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

Bunu nasıl başarabilirim ?


124 jasmine_007 Feb 20 2014 at 16:11

Yukarıda bahsedilmeyen bir R örneği yapmak için çok kolay ve verimli bir yolum var. Öncelikle yapınızı tanımlayabilirsiniz. Örneğin,

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

>fix(mydata)

Ardından verilerinizi manuel olarak girebilirsiniz. Bu, büyük örnekler yerine daha küçük örnekler için etkilidir.

119 JT85 Apr 10 2013 at 21:51

Verilerinizden hızlı bir şekilde oluşturmak için dput, verileri panonuza kopyalayabilir (bir parça) ve aşağıdakileri R'de çalıştırabilirsiniz:

Excel'deki veriler için:

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

txt dosyasındaki veriler için:

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

sepGerekirse ikinciyi değiştirebilirsiniz . Bu, yalnızca verileriniz elbette panodaysa işe yarar.

118 BrodieG Feb 12 2015 at 22:24

Yönergeler:


Sorularınızı oluştururken temel amacınız, okuyucuların probleminizi sistemlerinde anlamalarını ve yeniden üretmelerini mümkün olduğunca kolaylaştırmak olmalıdır. Böyle yaparak:

  1. Giriş verilerini sağlayın
  2. Beklenen çıktıyı sağlayın
  3. Sorununuzu kısaca açıklayın
    • 20 satırdan fazla metin + kodunuz varsa, muhtemelen geri dönüp basitleştirebilirsiniz
    • Problemi / hatayı korurken kodunuzu olabildiğince basitleştirin

Bu biraz iş gerektirir, ancak başkalarından sizin için çalışmasını istediğiniz için adil bir değiş tokuş gibi görünüyor.

Veri Sağlama:


Yerleşik Veri Kümeleri

Şimdiye kadarki en iyi seçenek yerleşik veri kümelerine güvenmektir. Bu, başkalarının sorununuz üzerinde çalışmasını çok kolaylaştırır. Tip data()veri sizin için kullanılabilir ne olduğunu görmek için istemi Ar. Bazı klasik örnekler:

  • iris
  • mtcars
  • ggplot2::diamonds (harici paket, ancak hemen hemen herkes buna sahiptir)

Sorununuza uygun olanı bulmak için yerleşik veri kümelerini inceleyin.

Yerleşik veri kümelerini kullanmak için sorununuzu yeniden ifade edebilirseniz, iyi yanıtlar (ve olumlu oylar) alma olasılığınız çok daha yüksektir.

Kendi Oluşturulan Veriler

Sorununuz, mevcut veri kümelerinde temsil edilmeyen bir veri türüne çok özelse, sorununuzun kendini gösterdiği olası en küçük veri kümesini oluşturan R kodunu sağlayın. Örneğin

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

Şimdi sorumu cevaplamaya çalışan biri bu iki satırı kopyalayıp / yapıştırabilir ve hemen sorun üzerinde çalışmaya başlayabilir.

dput

Bir şekilde son çare , kullanabilirsiniz dputR kodu (örneğin bir veri nesnesini dönüştürmek için dput(myData)). "Son çare" olarak söylüyorum, çünkü çıktısı dputgenellikle oldukça hantal, kopyalayıp yapıştırmak için can sıkıcı ve sorunuzun geri kalanını belirsizleştiriyor.

Beklenen Çıktı Sağlayın:


Biri bir keresinde şöyle dedi:

Beklenen çıktının bir resmi 1000 kelimeye bedeldir

- çok bilge bir kişi

"Bu sonucu almayı bekliyordum" gibi bir şey ekleyebiliyorsanız:

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

Sorunuza gelince, insanların ne yapmaya çalıştığınızı daha hızlı anlaması çok daha olasıdır. Beklediğiniz sonuç büyük ve beceriksizse, probleminizi nasıl basitleştireceğiniz konusunda muhtemelen yeterince düşünmemişsinizdir (bir sonraki bölüme bakın).

Sorununuzu Kısaca Açıklayın


Yapmanız gereken en önemli şey, sorunuzu sormadan önce sorununuzu olabildiğince basitleştirmektir. Yerleşik veri kümeleriyle çalışmak için sorunu yeniden çerçevelemek bu konuda çok yardımcı olacaktır. Ayrıca, sadece basitleştirme sürecinden geçerek kendi probleminize cevap vereceğinizi de sıklıkla göreceksiniz.

İşte bazı iyi sorular örnekleri:

  • ile veri seti inşa
  • ile kullanıcı tarafından oluşturulan veriler

Her iki durumda da, kullanıcının sorunları neredeyse kesin olarak sağladıkları basit örneklerle değildir. Aksine, problemlerinin doğasını soyutladılar ve sorularını sormak için basit bir veri setine uyguladılar.

Neden Bu Soruya Başka Bir Cevap?


Bu cevap, en iyi uygulama olduğunu düşündüğüm şeye odaklanıyor: yerleşik veri kümelerini kullanın ve sonuç olarak beklediğiniz şeyi minimal bir biçimde sağlayın. En belirgin cevaplar diğer yönlere odaklanır. Bu cevabın öne çıkmasını beklemiyorum; bu sadece burada, yorumlarda acemi sorularına bağlantı verebilmem için.

113 daniel Nov 27 2014 at 09:02

Tekrar üretilebilir kod, yardım almanın anahtarıdır. Ancak, verilerinin bir kısmını bile yapıştırmaktan şüphelenebilecek birçok kullanıcı var. Örneğin, hassas verilerle veya bir araştırma makalesinde kullanmak üzere toplanan orijinal veriler üzerinde çalışıyor olabilirler. Herhangi bir nedenle, verilerimi herkese açık olarak yapıştırmadan önce "deforme etmek" için kullanışlı bir işleve sahip olmanın güzel olacağını düşündüm. anonymizePaketinden işlevi SciencesPoçok saçma, ama benim için birlikte güzel çalışıyor dputfonksiyonu.

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

Sonra anonimleştiriyorum:

> 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

Ayrıca anonimleştirme ve dput komutunu uygulamadan önce tüm veriler yerine birkaç değişkeni örneklemek isteyebilir.

    # 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 userJT Feb 22 2013 at 22:29

Genellikle bir örnek için bazı verilere ihtiyaç duyarsınız, ancak verilerinizi tam olarak göndermek istemezsiniz. Kurulan kitaplıkta bazı mevcut data.frame'i kullanmak için, içeri aktarmak için data komutunu kullanın.

Örneğin,

data(mtcars)

ve sonra problemi yap

names(mtcars)
your problem demostrated on the mtcars data set
92 TMS Jan 04 2014 at 02:07

Kullanılarak komut dosyasına kolayca eklenemeyen büyükdput() veri kümeniz varsa , verilerinizi pastebin'e gönderin ve bunları kullanarak yükleyin read.table:

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

@ Henrik'ten esinlenilmiştir .

90 TylerRinker Jun 11 2015 at 20:57

Tekrarlanabilir verileri hızlı bir şekilde paylaşma ihtiyacını karşılamak için wakefield paketini geliştiriyorum , bazen dputdaha küçük veri kümeleri için iyi çalışıyor , ancak uğraştığımız sorunların çoğu çok daha büyük, bu kadar büyük bir veri kümesini paylaşmak dputpratik değil.

Hakkında:

wakefield , kullanıcının verileri yeniden üretmek için minimum kodu paylaşmasına izin verir. Kullanıcın, verilerde (cinsiyet, yaş, gelir vb.) Reali taklit eden herhangi bir sayıda önceden ayarlanmış değişken işlevi (şu anda 70 vardır) belirler ve belirtir.

Kurulum:

Şu anda (2015-06-11), wakefield bir GitHub paketidir ancak birim testleri yazıldıktan sonra sonunda CRAN'a gidecek. Hızlı bir şekilde kurmak için şunu kullanın:

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

Misal:

İşte bir örnek:

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

Bu şunları üretir:

    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
.. ...   ... ...    ...      ... ...    ...   ...
73 docendodiscimus Jan 09 2015 at 22:09

factorVerilerinizde çoğaltılabilir hale getirmek istediğiniz bir veya daha fazla değişken varsa, buna dput(head(mydata))eklemeyi düşünün droplevels, böylece küçültülmüş veri kümesinde bulunmayan faktör seviyeleri dputçıktınıza dahil edilmez. örneği en aza indirin :

dput(droplevels(head(mydata)))
66 CMichael Jan 09 2015 at 20:11

Merak ediyorum eğer bir http://old.r-fiddle.org/bağlantı, bir sorunu paylaşmanın çok düzgün bir yolu olabilir. Gibi benzersiz bir kimlik alır ve hatta SO'ya yerleştirmeyi düşünebilirsiniz.

49 user2100721 Jul 22 2016 at 17:01

Lütfen konsol çıktılarınızı şu şekilde yapıştırmayın:

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

Doğrudan kopyalayıp yapıştıramayız.

Sorular ve cevaplar düzgün tekrarlanabilir hale getirmek için, kaldırmaya çalışırsanız +& >göndermeden önce ve koyun #böyle çıkışlar ve yorumlar için:

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

Bir şey daha, belirli bir paketten herhangi bir işlevi kullandıysanız, o kitaplıktan bahsedin.

34 andrii Aug 19 2017 at 02:02

Bunu reprex kullanarak yapabilirsiniz .

Gibi mt1022 kaydetti , "... asgari, tekrarlanabilir örneğini üretmek için iyi bir pakettir 'reprex' dan tidyverse ".

Tidyverse'e göre :

"Reprex" in amacı, sorunlu kodunuzu diğer insanların çalıştırabileceği ve acınızı hissedebileceği şekilde paketlemektir.

Tidyverse web sitesinde bir örnek verilmiştir .

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

Tekrarlanabilir bir örnek oluşturmanın en basit yolunun bu olduğunu düşünüyorum .

33 5revs,2users84%user5947301 Apr 20 2016 at 17:50

Çok ilginç bulduğum yukarıdaki yanıtların yanı sıra, burada tartışıldığı gibi bazen çok kolay olabilir: - R İLE YARDIM ALMAK İÇİN MİNİMAL YENİDEN ÜRETİLİR BİR ÖRNEK NASIL YAPILIR

Rastgele vektör oluşturmanın birçok yolu vardır R'de 2 ondalık sayıya yuvarlanmış rastgele değerlerle veya R'de rastgele matrisle 100 numaralı bir vektör oluşturun

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

Bazen boyut vb. Gibi çeşitli nedenlerden dolayı belirli bir veriyi paylaşmanın çok zor olduğunu unutmayın. Ancak, yukarıdaki yanıtların tümü harika ve tekrarlanabilir bir veri örneği yapmak istendiğinde düşünmek ve kullanmak çok önemlidir. Ancak, bir veriyi orijinal olarak temsili yapmak için (OP'nin orijinal verileri paylaşamaması durumunda), veri örneğiyle bazı bilgileri eklemenin iyi olacağını unutmayın (verilere mydf1 adını verirsek)

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

Ayrıca, Veri yapıları olabilecek bir verinin türü, uzunluğu ve öznitelikleri bilinmelidir.

#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 TheRimalaya Apr 10 2016 at 01:15

İşte önerilerimden bazıları:

  • Varsayılan R veri kümelerini kullanmayı deneyin
  • Kendi veri kümeniz varsa, bunları ekleyin dput, böylece diğerleri size daha kolay yardımcı olabilir
  • install.package()Gerçekten gerekli olmadıkça kullanmayın , insanlar sadece kullanırsanız requireveya kullanırsanız anlayacaktır.library
  • Özlü olmaya çalışın,

    • Biraz veri kümesine sahip olun
    • İhtiyacınız olan çıktıyı olabildiğince basit bir şekilde tanımlamaya çalışın
    • Soruyu sormadan önce kendin yap
  • Görüntü yüklemek kolaydır, bu nedenle varsa çizimleri yükleyin
  • Ayrıca sahip olabileceğiniz hataları da ekleyin

Bütün bunlar tekrarlanabilir bir örneğin parçasıdır.

18 dank Apr 05 2017 at 04:08

testthatNe olmasını beklediğinizi göstermek için paketin işlevlerini kullanmak iyi bir fikirdir . Böylece, diğer kişiler kodunuzu hatasız çalışana kadar değiştirebilir. Bu, size yardım etmek isteyenlerin yükünü hafifletir, çünkü metinsel tanımınızı çözmek zorunda olmadıkları anlamına gelir. Örneğin

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

"bence x'in y 10'a eşit veya daha fazla 1.23, aksi takdirde 3.21 çıkacağını düşünüyorum, ancak hiçbir sonuç alamadım". Bu aptalca örnekte bile, kodun kelimelerden daha açık olduğunu düşünüyorum. Kullanmak testthat, yardımcınızın koda odaklanmasını sağlar, bu da zaman kazandırır ve göndermeden önce sorununuzu çözdüklerini bilmeleri için bir yol sağlar.