Tekrarlanabilir harika bir R örneği nasıl yapılır
İş 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
, data
vb?
İnsan nasıl büyük yapar r tekrarlanabilir örnek?
Yanıtlar
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. letters
alfabeyi 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ımx <- 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.xts
vektö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 dput
alt 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.table
nesneler 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, text
parametresi 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")
.
( 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,mtcars
veri kümesini R'de yeniden oluşturmak için aşağıdaki adımları gerçekleştirirdim:dput(mtcars)
R koşmak- Çıktıyı kopyalayın
- 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.
Ş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))
raster
Paket 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")
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, dput
aş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=n
argü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==
İş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.
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 .
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
")
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
Ş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 ?
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.
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))
sep
Gerekirse ikinciyi değiştirebilirsiniz . Bu, yalnızca verileriniz elbette panodaysa işe yarar.
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:
- Giriş verilerini sağlayın
- Beklenen çıktıyı sağlayın
- 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 dput
R kodu (örneğin bir veri nesnesini dönüştürmek için dput(myData)
). "Son çare" olarak söylüyorum, çünkü çıktısı dput
genellikle 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.
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. anonymize
Paketinden işlevi SciencesPo
çok saçma, ama benim için birlikte güzel çalışıyor dput
fonksiyonu.
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
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
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 .
Tekrarlanabilir verileri hızlı bir şekilde paylaşma ihtiyacını karşılamak için wakefield paketini geliştiriyorum , bazen dput
daha 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 dput
pratik 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
.. ... ... ... ... ... ... ... ...
factor
Verilerinizde ç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)))
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.
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.
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 .
Ç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))
İş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ızrequire
veya 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.
testthat
Ne 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.