2468

同僚とパフォーマンスについて話し合ったり、教えたり、バグレポートを送信したり、メーリングリストやここStack Overflowでガイダンスを検索したりするときは、再現可能な例がよく聞かれ、常に役立ちます。

優れた例を作成するためのヒントは何ですか?のデータ構造をテキスト形式でどのように貼り付けますか?他にどのような情報を含める必要がありますか?

dput()、、dump()またはを使用する以外に他のトリックはありstructure()ますか?library()またはrequire()ステートメントをいつ含める必要がありますか?、、、などに加えてc、どの予約語を避けるべきですか?dfdata

性のある優れた例をどのように作成しますか?

4

23 に答える 23

1865

基本的に、最小限の再現可能な例(MRE)を使用すると、他のユーザーが自分のマシンで問題を正確に再現できるようになります。

MREは、次のアイテムで構成されています。

  • 問題を実証するために必要な最小限のデータセット
  • エラーを再現するために必要な最小限の実行可能なコード。これは、特定のデータセットで実行できます。
  • 使用されているパッケージ、Rバージョン、およびそれが実行されているOSに関するすべての必要な情報。
  • ランダムプロセスの場合、再現性のためのシード(によって設定)set.seed()

優れたMREの例については、使用している関数のヘルプファイルの下部にある「例」のセクションを参照してください。たとえば、と入力するか、Rコンソールにhelp(mean)ショートします。?mean

最小限のデータセットを提供する

通常、膨大なデータセットを共有する必要はなく、他の人があなたの質問を読むのを思いとどまらせる可能性があります。したがって、組み込みのデータセットを使用するか、元のデータに似た小さな「おもちゃ」の例を作成することをお勧めします。これは、実際には最小の意味です。何らかの理由で元のデータを本当に共有する必要がある場合は、dput()他の人がデータの正確なコピーを取得できるようにするなどの方法を使用する必要があります。

組み込みのデータセット

組み込みのデータセットの1つを使用できます。組み込みデータセットの包括的なリストは、で表示できますdata()。すべてのデータセットの簡単な説明があり、たとえば、?irisRに付属する「iris」データセットについて、より多くの情報を取得できます。インストールされたパッケージには、追加のデータセットが含まれている場合があります。

サンプルデータセットの作成

予備的注意:因子、日付、時系列などの特別な形式(クラスなど)が必要になる場合があります。これらには、次のような関数を使用します:as.factor、、、...例:as.Dateas.xts

d <- as.Date("2020-12-30")

どこ

class(d)
# [1] "Date"

ベクトル

x <- rnorm(10)  ## random vector normal distributed
x <- runif(10)  ## random vector uniformly distributed    
x <- sample(1:100, 10)  ## 10 random draws out of 1, 2, ..., 100    
x <- sample(LETTERS, 10)  ## 10 random draws out of built-in latin alphabet

マトリックス

m <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[1:4]))
m
#   A B C  D
# A 1 4 7 10
# B 2 5 8 11
# C 3 6 9 12

データフレーム

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
dat
#   id       date group age   type         x
# 1  1 2020-12-26     A  27 type 1 0.0356312
# 2  2 2020-12-27     B  19 type 2 1.3149588
# 3  3 2020-12-28     A  20 type 3 0.9781675
# 4  4 2020-12-29     B  26 type 4 0.8817912
# 5  5 2020-12-30     A  26 type 5 0.4822047
# 6  6 2020-12-31     B  28 type 6 0.9657529

注:dfこれは広く使用されていますが、データフレームに名前を付けない方がよいでしょう。これdf()は、F分布の密度(つまり、ポイントでの曲線の高さ)のR関数でありx、衝突する可能性があるためです。

元のデータをコピーする

特定の理由がある場合、または例を作成するのが難しすぎるデータがある場合は、を使用して、元のデータの小さなサブセットを提供できますdput

なぜ使用するのdput()ですか?

dputコンソールでデータを正確に再現するために必要なすべての情報をスローします。出力をコピーして質問に貼り付けるだけです。

(上から)呼び出すdatと、質問で共有した場合でも変数クラスやその他の機能に関する情報が不足している出力が生成されます。さらに、type列のスペースはそれで何もするのを難しくします。データの使用に着手した場合でも、データの重要な機能を正しく取得することはできません。

  id       date group age   type         x
1  1 2020-12-26     A  27 type 1 0.0356312
2  2 2020-12-27     B  19 type 2 1.3149588
3  3 2020-12-28     A  20 type 3 0.9781675

データをサブセット化する

サブセットを共有するか、を使用するかhead()subset()またはインデックスを使用しますiris[1:4, ]。次に、それをラップしてdput()、すぐにRに入れることができるものを他の人に与えます。

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")), row.names = c(NA, 
4L), class = "data.frame")

を使用dputする場合は、関連する列のみを含めることもできます。例:dput(mtcars [1:3、c(2、5、6)])

注:データフレームに多くのレベルの因子がある場合、dputデータのサブセットに存在しない場合でも、考えられるすべての因子レベルが一覧表示されるため、出力が扱いにくい場合があります。この問題を解決するには、このdroplevels()関数を使用できます。以下に、種が1つのレベルのみの要因であることに注意してくださいdput(droplevels(iris[1:4, ]))。もう1つの注意点dputは、キー付きdata.tableオブジェクトまたはからのグループ化tbl_df(クラスgrouped_df)では機能しないことtidyverseです。このような場合、共有する前に通常のデータフレームに戻すことができますdput(as.data.frame(my_data))

最小限のコードを生成する

最小限のデータ(上記を参照)と組み合わせると、コードをコピーして貼り付けるだけで、別のマシンで問題を正確に再現できます。

これは簡単な部分ですが、多くの場合そうではありません。あなたがしてはいけないこと:

  • あらゆる種類のデータ変換を表示します。提供されたデータがすでに正しい形式になっていることを確認してください(もちろん、それが問題でない限り)
  • どこかにエラーが発生するスクリプト全体をコピーして貼り付けます。エラーが発生する行を正確に特定してください。多くの場合、あなたは自分自身の問題が何であるかを知るでしょう。

あなたがすべきこと:

  • 使用するパッケージを追加します(を使用library()
  • 新しいRセッションでコードをテスト実行して、コードが実行可能であることを確認します。人々はあなたのデータとあなたのコードをコンソールにコピーアンドペーストして、あなたが持っているものと同じものを手に入れることができるはずです。
  • 接続を開いたりファイルを作成したりする場合は、コードを追加して接続を閉じるか、ファイルを削除します(を使用してunlink()
  • オプションを変更する場合は、元のオプションに戻すためのステートメントがコードに含まれていることを確認してください。(例op <- par(mfrow=c(1,2)) ...some code... par(op)

必要な情報を提供する

ほとんどの場合、Rバージョンとオペレーティングシステムだけで十分です。パッケージとの競合が発生した場合、の出力を提供するsessionInfo()ことは非常に役立ちます。他のアプリケーションへの接続について話すときは(ODBCなどを介して)、それらのバージョン番号と、可能であればセットアップに関する必要な情報も提供する必要があります。

R StudioでRを実行している場合は、を使用rstudioapi::versionInfo()するとRStudioのバージョンを報告できます。

特定のパッケージに問題がある場合は、の出力を指定してパッケージバージョンを提供することをお勧めしますpackageVersion("name of the package")

シード

set.seed()シード1 、つまり特定の状態を指定することで、Rの乱数ジェネレーターは固定されます。これにより、、、および他の多くのランダム関数が常に同じ結果を返すことが可能にsample()なります。rnorm()runif()

set.seed(42)
rnorm(3)
# [1]  1.3709584 -0.5646982  0.3631284

set.seed(42)
rnorm(3)
# [1]  1.3709584 -0.5646982  0.3631284

1注:の出力は、R>3.6.0と以前のバージョンで異なります。ランダムプロセスに使用したRバージョンを指定します。古い質問に従うと、わずかに異なる結果が得られても驚かないでください。このような場合に同じ結果を得るには、前に-functionを使用できます(例:) set.seed()RNGversion()set.seed()RNGversion("3.5.2")

于 2011-05-11T11:40:18.877 に答える
623

(再現可能な例を書く方法からの私のアドバイスです。私はそれを短く、しかし甘いものにしようとしました)。

再現可能な例の書き方

再現可能な例を提供すれば、Rの問題について良い助けを得る可能性が最も高くなります。再現可能な例では、Rコードをコピーして貼り付けるだけで、他の誰かが問題を再現できます。

例を再現可能にするには、必要なパッケージ、データ、コード、およびR環境の説明の4つを含める必要があります。

  • パッケージはスクリプトの先頭にロードする必要があるため、例で必要なパッケージを簡単に確認できます。

  • 電子メールまたはStackOverflowの質問にデータを含める最も簡単な方法は、データdput()を再作成するためのRコードを生成するために使用することです。たとえばmtcars、Rでデータセットを再作成するには、次の手順を実行します。

    1. dput(mtcars)Rで実行
    2. 出力をコピーします
    3. 再現可能なスクリプトで、「」と入力してmtcars <- から貼り付けます。
  • あなたのコードが他の人に読みやすいことを確認するために少し時間を費やしてください:

    • スペースを使用し、変数名が簡潔でありながら有益であることを確認してください

    • コメントを使用して、問題がどこにあるかを示します

    • 問題に関係のないものはすべて削除するように最善を尽くしてください。
      コードが短いほど、理解しやすくなります。

  • sessionInfo()コードのコメントにの出力を含めます。これにより、 R環境が要約され、古いパッケージを使用しているかどうかを簡単に確認できます。

新しいRセッションを開始し、スクリプトをに貼り付けることで、実際に再現可能な例を作成したことを確認できます。

すべてのコードをメールに入れる前に、 Gistgithubに入れることを検討してください。それはあなたのコードに素晴らしい構文のハイライトを与えるでしょう、そしてあなたは何も電子メールシステムによって壊されることを心配する必要はありません。

于 2011-05-11T13:57:51.190 に答える
321

個人的には、「ワン」ライナーが好きです。線に沿った何か:

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シェープファイルなど)を介してデータセットを取得できます(タスクビューの空間ビューを参照)。

library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")
于 2011-05-11T11:22:15.987 に答える
296

この投稿に触発されて、StackOverflow reproduce(<mydata>)に投稿する必要があるときに便利な関数を使用するようになりました。


クイックインストラクション

を再現するオブジェクトの名前である場合myDataは、Rで次のコマンドを実行します。

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

reproduce(myData)

詳細:

この関数はインテリジェントなラッパーでdputあり、次のことを行います。

  • 大きなデータセットを自動的にサンプリングします(サイズとクラスに基づきます。サンプルサイズは調整可能です)
  • dput出力を作成します
  • エクスポートする列を指定できます
  • 前面に追加する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は約100x102です。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==

また、出力全体が、切り刻まれた行の長い段落ではなく、1つの長い行になっていることにも注意してください。これにより、Stack Overflowの質問の投稿が読みやすくなり、コピーと貼り付けも簡単になります。


2013年10月の更新:

これで、テキスト出力の何行を占めるか(つまり、スタックオーバーフローに何行を貼り付けるか)を指定できます。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==
于 2013-05-13T22:20:34.470 に答える
209

ここに良いガイドがあります。

最も重要なポイントは次のとおりです。問題が何であるかを確認するために実行できる小さなコードを作成します。これに役立つ関数はですがdput()、データが非常に大きい場合は、小さなサンプルデータセットを作成するか、最初の10行程度のみを使用することをお勧めします。

編集:

また、問題が自分自身のどこにあるかを特定したことを確認してください。この例は、「200行目にエラーがあります」というRスクリプト全体であってはなりません。R(私は大好きですbrowser())とGoogleのデバッグツールを使用すると、問題がどこにあるかを実際に特定し、同じことがうまくいかないという些細な例を再現できるはずです。

于 2011-05-11T11:21:24.100 に答える
178

R-helpメーリングリストには、データ生成の例を含む、質問の質問と回答の両方をカバーする投稿ガイドがあります。

例:誰かが実際に実行できる小さな例を提供すると役立つ場合があります。例えば:

次のような行列xがある場合:

  > 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行、「row」、「col」、「value」という名前の3つの列があり、ディメンション名が「row」と「col」の値であるデータフレームに変換するにはどうすればよいですか。

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

)。

小さいという言葉は特に重要です。再現性のある最小限の例を目指す必要があります。つまり、問題を説明するためにデータとコードをできるだけ単純にする必要があります。

編集:きれいなコードは醜いコードよりも読みやすいです。スタイルガイドを使用します。

于 2011-05-11T13:17:38.937 に答える
173

R.2.14以降(私は推測します)、データテキスト表現を直接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
") 
于 2012-06-29T08:32:04.220 に答える
153

どんなに努力しても、問題が実際には小さなデータでは再現できない場合があり、合成データでは発生しません(ただし、問題を再現しなかった合成データセットをどのように作成したかを示すことは有用です。それはいくつかの仮説を除外します)。

  • データをWebのどこかに投稿し、URLを提供する必要がある場合があります。
  • データを一般に公開することはできないが、まったく共有することはできない場合は、関係者に電子メールで送信することを提案できる可能性があります(ただし、これにより、わざわざ仕事をする人の数は減ります。その上に)。
  • データを公開できない人はどのような形式でも公開することに敏感なので、実際にこれが行われているのを見たことがありませんが、データが十分に匿名化/スクランブル/破損していれば、データを投稿できる場合もあると思われます何らかの方法で。

これらのいずれかを行うことができない場合は、おそらく問題を解決するためにコンサルタントを雇う必要があります...

編集:匿名化/スクランブリングのための2つの有用なSO質問:

于 2011-07-14T19:49:15.733 に答える
142

これまでの答えは、再現性の部分にとって明らかに素晴らしいものです。これは、再現可能な例が質問の唯一の構成要素になることはできず、またそうすべきではないことを明確にするためだけのものです。これまでにどのように到達しようとしたかだけでなく、どのように見せたいか、問題の輪郭を説明することを忘れないでください。コードだけでは不十分です。言葉も必要です。

避けるべきことの再現可能な例を次に示します(実際の例から引用し、無実の人々を保護するために名前を変更しました)。


以下はサンプルデータと私が問題を抱えている機能の一部です。

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

どうすればこれを達成できますか?


于 2012-07-09T15:41:13.287 に答える
131

私は、上記に言及されていないRの例を作成するための非常に簡単で効率的な方法を持っています。最初に構造を定義できます。例えば、

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

>fix(mydata)

'fix'コマンドを実行すると、このポップアップボックスが表示されます

次に、データを手動で入力できます。これは、大きな例ではなく小さな例で効率的です。

于 2014-02-20T09:11:37.990 に答える
128

データをすばやく作成するdputには、データ(の一部)をクリップボードにコピーして、Rで次のコマンドを実行します。

Excelのデータの場合:

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

.txtファイルのデータの場合:

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

sep必要に応じて後者で変更できます。もちろん、これはデータがクリップボードにある場合にのみ機能します。

于 2013-04-10T14:51:08.993 に答える
128

ガイドライン:


質問を作成する際の主な目的は、読者が自分のシステムで問題を理解して再現できるようにすることです。そうするために:

  1. 入力データを提供する
  2. 期待される出力を提供する
  3. 問題を簡潔に説明してください
    • 20行を超えるテキストとコードがある場合は、おそらく戻って簡略化できます
    • 問題/エラーを維持しながら、コードを可能な限り単純化する

これには多少の作業が必要ですが、他の人に作業を依頼するため、公正なトレードオフのように見えます。

データの提供:


組み込みのデータセット

最善のオプション、組み込みのデータセットに依存することです。これにより、他の人があなたの問題に取り組むのが非常に簡単になります。Rプロンプトdata()で入力して、使用可能なデータを確認します。いくつかの古典的な例:

  • iris
  • mtcars
  • ggplot2::diamonds(外部パッケージですが、ほとんどの人が持っています)

組み込みのデータセットを調べて、問題に適したデータセットを見つけます。

組み込みのデータセットを使用するように問題を言い換えることができれば、良い答え(および賛成票)を得る可能性がはるかに高くなります。

自己生成データ

問題が既存のデータセットに表されていないタイプのデータに固有である場合は、問題が現れる可能性のある最小のデータセットを生成するRコードを提供します。例えば

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

私の質問に答えようとしている人は、これらの2行をコピーして貼り付け、すぐに問題の作業を開始できます。

dput

最後の手段として、dputデータオブジェクトをRコードに変換するために使用できます(例dput(myData))。dputの出力はかなり扱いにくく、コピー&ペーストするのが面倒で、残りの質問を曖昧にすることが多いため、私は「最後の手段」と言います。

期待される出力を提供する:


誰かがかつて言った:

期待される出力の写真は1000ワードの価値があります

-賢者

「この結果が得られると期待していました」のようなものを追加できる場合:

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

あなたの質問に対して、人々はあなたが何をしようとしているのかを素早く理解する可能性がはるかに高くなります。期待される結果が大きくて扱いにくい場合は、問題を単純化する方法について十分に考えていない可能性があります(次を参照)。

問題を簡潔に説明する


主なことは、質問をする前に、問題をできるだけ単純化することです。組み込みのデータセットで機能するように問題を再構成すると、この点で大いに役立ちます。また、単純化のプロセスを経るだけで、自分の問題に答えることができることもよくあります。

良い質問の例を次に示します。

どちらの場合も、ユーザーの問題は、彼らが提供する簡単な例ではほぼ確実にありません。むしろ、彼らは問題の性質を抽象化し、それを単純なデータセットに適用して質問をしました。

なぜこの質問に対するさらに別の答えですか?


この回答は、ベストプラクティスであると私が考えることに焦点を当てています。組み込みのデータセットを使用し、最小限の形式で結果として期待するものを提供します。最も顕著な答えは他の側面に焦点を当てています。私は、この答えが目立つようになるとは思っていません。これは、初心者の質問へのコメントでリンクできるようにするためだけにここにあります。

于 2015-02-12T15:24:00.503 に答える
124

再現可能なコードが助けを得る鍵です。ただし、データのチャンクでさえ貼り付けることに懐疑的なユーザーはたくさんいます。たとえば、機密データや、研究論文で使用するために収集された元のデータを処理している可能性があります。

どういうわけか、公開する前にデータを「変形」するための便利な機能があればいいのにと思いました。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

匿名化と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
于 2014-11-27T02:02:02.237 に答える
107

多くの場合、例としていくつかのデータが必要ですが、正確なデータを投稿する必要はありません。確立されたライブラリの既存のdata.frameを使用するには、dataコマンドを使用してインポートします。

例えば、

data(mtcars)

そして問題を実行します

names(mtcars)
your problem demostrated on the mtcars data set
于 2013-02-22T15:29:33.070 に答える
100

を使用してスクリプトに簡単に配置できない大きなデータセットがある場合は、データをペーストビンdput()に投稿し、次を使用してロードします。read.table

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

ヘンリックに触発されました。

于 2014-01-03T19:07:03.950 に答える
94

私は、再現可能なデータをすばやく共有するというこのニーズに対処するためにwakefieldパッケージdputを開発しています。小さなデータセットでは問題なく機能することもありますが、私たちが扱う問題の多くははるかに大きく、このような大きなデータセットを介して共有することdputは現実的ではありません。

約:

wakefieldを使用すると、ユーザーは最小限のコードを共有してデータを再現できます。ユーザーは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
.. ...   ... ...    ...      ... ...    ...   ...
于 2015-06-11T13:57:38.023 に答える
77

factor再現可能にしたいデータに1つ以上の変数がある場合は、最小化されたデータセットに存在しない因子のレベルが出力に含まれないように、それにdput(head(mydata))追加することを検討してください。例を最小限にします:droplevelsdput

dput(droplevels(head(mydata)))
于 2015-01-09T15:09:51.513 に答える
70

http://old.r-fiddle.org/リンクが問題を共有するための非常に優れた方法である可能性があるのではないかと思います。のような一意のIDを受け取り、SOに埋め込むことも考えられます。

于 2015-01-09T13:11:48.777 に答える
51

次のようにコンソール出力を貼り付けないでください。

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

もう1つ、特定のパッケージの関数を使用したことがある場合は、そのライブラリについて言及してください。

于 2016-07-22T10:01:36.653 に答える
41

reprexを使用してこれを行うことができます。

mt1022が指摘したように、「...最小限の再現可能な例を作成するための優れたパッケージは、 tidyverseからの「reprex」です」。

Tidyverseによると:

「reprex」の目標は、問題のあるコードを他の人が実行して痛みを感じることができるようにパッケージ化することです。

例はtidyverseのWebサイトにあります。

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

これが再現可能な例を作成する最も簡単な方法だと思います。

于 2017-08-18T19:02:43.107 に答える
37

私が非常に興味深いと思った上記のすべての答えとは別に、ここで説明しているように、非常に簡単な場合があります。Rの助けを得るために最小限の再現可能な例を作成する方法

ランダムベクトルを作成する方法はたくさんあります。Rのランダム値を小数点以下2桁に丸めた、またはRのランダム行列を使用して100個の数値ベクトルを作成します。

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))
于 2016-04-20T10:50:39.527 に答える
30

これが私の提案のいくつかです:

  • デフォルトのRデータセットを使用してみてください
  • 独自のデータセットがある場合は、それらをに含めてdput、他の人がより簡単に手助けできるようにします
  • install.package()本当に必要な場合を除いて使用しないでくださいrequirelibrary
  • 簡潔にするようにしてください、

    • いくつかのデータセットを持っている
    • 必要な出力をできるだけ簡単に説明するようにしてください
    • 質問する前に自分でやってください
  • 画像をアップロードするのは簡単なので、もしあればプロットをアップロードしてください
  • エラーが発生した場合も含めてください

これらはすべて、再現可能な例の一部です。

于 2016-04-09T18:15:19.467 に答える
21

パッケージの関数を使用して、testthat予想されることを示すことをお勧めします。したがって、他の人がエラーなしで実行されるまでコードを変更できます。これにより、テキストによる説明をデコードする必要がなくなるため、支援したい人の負担が軽減されます。例えば

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

「xはyが10以上の場合は1.23、それ以外の場合は3.21になると思いますが、どちらの結果も得られなかった」よりも明確です。このばかげた例でも、コードは言葉よりも明確だと思います。を使用testthatすると、ヘルパーはコードに集中できるため、時間を節約でき、問題を投稿する前に、問題が解決したことを知ることができます。

于 2017-04-04T21:08:35.587 に答える