web-dev-qa-db-ja.com

すばらしいRの再現可能な例を作る方法

同僚とパフォーマンスについて話し合う、教える、バグ報告を送る、あるいはメーリングリストそしてここではStack Overflowに関するガイダンスを検索するときは、 再現可能な例 がよく尋ねられ、いつも役に立ちます。

優れた例を作成するためのヒントは何ですか? r のデータ構造をテキスト形式で貼り付けるにはどうすればよいですか。他にどのような情報を含めるべきですか?

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

どうやって r の再現可能な例を作るのでしょうか。

2476
Andrie

再現可能な最小限の例は、次の項目で構成されています。

  • エラーを再現するのに必要な最小限のデータセット
  • エラーを再現するのに必要な最小限の runnable コード。与えられたデータセットで実行することができます。
  • 使用されているパッケージ、Rバージョン、それが実行されているシステムに関する必要な情報。
  • ランダムプロセスの場合、再現性のためのシード(set.seed()で設定)

使用されている関数のヘルプファイルの例を見てみると役に立つことがよくあります。一般に、そこに示されているすべてのコードは、再現可能な最小限の例(データが提供され、最小限のコードが提供され、すべてが実行可能なもの)の要件を満たしています。

最小限のデータセットを作成する

ほとんどの場合、これはいくつかの値を持つベクトル/データフレームを提供するだけで簡単に実行できます。または、ほとんどのパッケージで提供されている組み込みデータセットの1つを使用することもできます。
組み込みデータセットの包括的なリストはlibrary(help = "datasets")で見ることができます。すべてのデータセットには簡単な説明があり、たとえば?mtcarsを使ってより多くの情報を得ることができます。ここで 'mtcars'はリスト内のデータセットの1つです。他のパッケージは追加のデータセットを含むかもしれません。

ベクトルを作るのは簡単です。時にはそれに何らかのランダム性を加えることが必要であり、それをするための関数がたくさんあります。 sample()はベクトルを無作為化するか、またはほんの少しの値で無作為ベクトルを与えることができます。 lettersはアルファベットを含む便利なベクトルです。これは要因を作るために使用することができます。

いくつかの例:

  • ランダムな値:正規分布の場合はx <- rnorm(10)、一様分布の場合はx <- runif(10)、...
  • いくつかの値の並べ替え:ベクトル1:10に対するx <- sample(1:10)のランダムな順序。
  • ランダムな要因:x <- sample(letters[1:4], 20, replace = TRUE)

行列の場合、matrix()を使うことができます。例えば:

matrix(1:10, ncol = 2)

データフレームの作成はdata.frame()を使って行うことができます。データフレーム内のエントリに名前を付け、過度に複雑にしないように注意する必要があります。

例 :

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

いくつかの質問では、特定のフォーマットが必要になることがあります。これらのために、提供されているas.someType関数のいずれかを使用することができます:as.factoras.Dateas.xts、...これらはベクトルおよび/またはデータフレームトリックと組み合わせて。

データをコピーする

これらのヒントを使用して構築するのが難しすぎるデータがある場合は、head()subset()、またはインデックスを使用して、元のデータのサブセットをいつでも作成できます。その後を使用してください。すぐにRに入れることができる何かを私たちに与えるためのdput()

> dput(head(iris,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 = c("setosa", 
"versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

データフレームに多数のレベルをもつ因子がある場合、dputの出力は、データのサブセットに存在しなくても可能性のあるすべての因子レベルを表示するため、扱いにくい場合があります。この問題を解決するために、droplevels()関数を使うことができます。以下は、種が1つのレベルしかない要因であることに注意してください。

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

dputに関するもう1つの注意点は、キー付きのdata.tableオブジェクトや、dplyrからグループ化されたtbl_df(クラスgrouped_df)には機能しないことです。このような場合は、共有する前に通常のデータフレームに変換し直すことができます(dput(as.data.frame(my_data)))。

最悪の場合、read.tabletextパラメータを使用して読み込むことができるテキスト表現を指定できます。

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

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

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

これは簡単な部分であるべきですが、そうでないことが多いです。してはいけないことは、

  • あらゆる種類のデータ変換を追加します。提供されたデータがすでに正しい形式であることを確認してください(それがもちろん問題でない限り)
  • エラーが発生する関数全体またはコードの一部をコピーして貼り付けます。まず、どの行が正確にエラーになったのかを調べます。多くの場合、あなたは問題があなた自身であるものを見つけるでしょう。

あなたがすべきことは、

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

追加情報を与える

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

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

特定のパッケージに問題があるなら、packageVersion("name of the package")の出力を与えることによってパッケージのバージョンを提供したいかもしれません。

1595
Joris Meys

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

再現可能な例の書き方.

再現可能な例を提供するならば、あなたはあなたのR問題に関して良い助けを得る可能性が最も高いです。再現可能な例では、Rコードをコピーして貼り付けるだけで、他の人があなたの問題を再現することができます。

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

  • パッケージ はスクリプトの先頭にロードする必要があるので、例に必要なものは簡単にわかります。

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

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

    • スペースを使用し、変数名は簡潔にしてください。

    • あなたの問題がどこにあるかを示すためにコメントを使う

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

  • コードのコメントにsessionInfo()の出力を含めます。これはあなたの R環境 をまとめたもので、古いパッケージを使っているかどうかをチェックするのを簡単にします。

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

すべてのコードをEメールに入れる前に、 Gist github に置くことを検討してください。それはあなたのコードに素敵な構文の強調表示を与えるでしょう、そしてあなたは電子メールシステムによって何かがおかしくなるのを心配する必要はありません。

559
hadley

個人的には、私は "one"ライナーを好みます。線に沿って何か:

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パッケージを使って空間データを操作している場合は、ランダムデータを生成できます。パッケージvignetteにはたくさんの例がありますが、これは小さなナゲットです。

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で実装されている空間オブジェクトが必要な場合は、 "spatial"パッケージの外部ファイル(ESRI shapefileなど)からデータセットを取得できます(タスクビューの[Spatial]ビューを参照)。

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

この非常にポストに触発されて、私は今便利な機能を使います
reproduce(<mydata>)私がStackOverflowに投稿する必要があるとき。


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

myDataが再現するオブジェクトの名前である場合、Rで以下を実行してください。

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

reproduce(myData)

詳細:

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

  • 大きなデータセットを自動的にサンプリングします(サイズとクラスに基づきます。サンプルサイズは調整可能です)。
  • dput出力を作成します
  • エクスポートする which columnsを指定できます。
  • 簡単にコピーして貼り付けることができるように、その前に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 x 102です。私は10行といくつかの特定の列をサンプリングしたいと思います。

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

以下のように出力されます。

This is what the sample looks like: 

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


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

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

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

また、出力全体がニースの1行の長い行であり、切り取られた行の高さのある段落ではありません。これにより、SO質問の投稿を読みやすくなり、コピー+貼り付けも簡単になります。


2013年10月に更新:

これで、テキスト出力の何行分を使用するかを指定できます(つまり、StackOverflowに貼り付ける内容)。これには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==
265
Ricardo Saporta

これは良いガイドです:

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

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

編集:

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

186
Sacha Epskamp

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
  >

次のように、ディメンション名を 'row'および 'col'の値として持つ、8行と3行の 'row'、 'col'、および 'value'を持つデータフレームに変換する方法

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

Word small が特に重要です。 minimal の再現可能な例を目指してください。これは、問題を説明するためにデータとコードができるだけ単純であることを意味します。

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

159
Richie Cotton

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

たとえどんなに難しいことをしても、問題が実際には小さいデータで再現できないことや、合成データでは起こらないことがあります(ただし、{notした合成データセットを作成する方法を示すことは役立ちます) _いくつかの仮説を除外しているので、問題を再現してください。

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

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

編集:匿名化/スクランブリングに役立つ2つのSO質問:

140
Ben Bolker

これまでの答えは明らかに再現性の部分にとって素晴らしいものです。これは単に再現可能な例が問題の唯一の構成要素ではあり得ないことを明確にするためです。どのように見せたいのか、問題の輪郭を説明することを忘れないでください。コードが足りません。あなたは言葉も必要です。

これは避けるべきことの再現可能な例です(実際の例から抜粋した、名前は無実を保護するために変更されました):


以下はサンプルデータと私が困った機能の一部です。

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

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


130
Ari B. Friedman

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

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

>fix(mydata)

When you execute 'fix' command, you will get this pop-up box

それからあなたは手動であなたのデータを入力することができます。これは大きな例よりも小さい例には効果的です。

116
jasmine_007

あなたのデータのdputを素早く作成するために、あなたはあなたのクリップボードにデータ(の一部)をコピーしてRで以下を実行することができます:

excelのデータの場合:

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

テキストファイルのデータの場合:

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

必要ならば後者でsepを変更することができます。これはあなたのデータがもちろんクリップボードにある場合にのみ機能します。

115
JT85

ガイドライン:


あなたの質問を作成するあなたの主な目的は読者が彼らのシステムであなたの問題を理解し再現することをできるだけ簡単にすることであるべきです。そうするには:

  1. 入力データを提供する
  2. 期待される出力を提供する
  3. あなたの問題を簡潔に説明しなさい。
    • あなたが20行以上のテキスト+コードを持っているなら、あなたはたぶん戻って単純化することができます
    • 問題やエラーを防ぎながら、できるだけコードを単純化する

これはいくらかの作業を必要としますが、あなたが他の人にあなたのために作業をするよう求めているので、公正なトレードオフのように見えます。

データ提供


組み込みデータセット

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

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

問題に適したデータセットを見つける方法については、SO QAを参照してください。

組み込みのデータセットを使うようにあなたの問題を言い換えることができるなら、あなたはより良い答え(そして支持票)を得る可能性がはるかに高いです。

自己生成データ

既存のデータセットで表現されていないデータの種類に問題が非常に特定されている場合は、問題が明らかになっている 最小 可能なデータセットを生成する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

あなたの質問には、人々はあなたがやろうとしていることを素早く理解する可能性がはるかに高いです。あなたの予想される結果が大きくて扱いにくい場合、あなたはおそらくあなたの問題を単純化する方法について十分に考えていませんでした(次を見てください)。

問題を簡潔に説明する


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

これは良い質問の例です。

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

なぜこの質問に対するもう1つの回答があるのでしょうか。


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

110
BrodieG

再現可能なコードは助けを得るための鍵です。ただし、自分のデータのチャンクでさえも貼り付けることに懐疑的なユーザーが多数います。たとえば、機密データを使用したり、調査論文で使用するために収集された元のデータを使用したりします。何らかの理由で、私はそれを公に貼り付ける前に私のデータを「変形する」ための便利な機能を持つことは素晴らしいことだと思いました。パッケージanonymizeSciencesPo関数は非常にばかげていますが、私にとっては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
107
daniel

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

例えば。、

data(mtcars)

それから問題をやりなさい

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

dput()を使って簡単にスクリプトに書き込めない大きなデータセットがある場合は、データを Pastebin に投稿してread.tableを使ってロードします。

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

@Henrik からヒントを得た。

88
TMS

再現可能なデータを素早く共有するために wakefieldpackage を開発しています。小規模なデータセットに対してdputがうまく機能することもありますが、対処する問題の多くは多くです大きい場合、dputを介してそのような大きなデータセットを共有するのは現実的ではありません。

について:

wakefield ユーザーは、データを再生するための最小限のコードを共有できます。ユーザーはn(行数)を設定し、もし本当ならifデータ(性別、年齢、収入など)を模倣するプリセット変数関数をいくつでも指定します(現在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
.. ...   ... ...    ...      ... ...    ...   ...
84
Tyler Rinker

dput(head(mydata))で再現可能にしたいデータに1つ以上のfactor変数がある場合は、それにdroplevelsを追加して、最小化されたデータセットに存在しない要因のレベルがdputの出力に含まれないようにします。例を作るために minimal

dput(droplevels(head(mydata)))
68

http://old.r-fiddle.org/ /リンクが問題を共有するための非常にきちんとした方法になるかどうか私は疑問に思います。それはのようなユニークなIDを受け取り、それをSOに埋め込むことさえ考えられます。

59
CMichael

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

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つ重要なことは、特定のパッケージの関数を使用したことがある場合は、そのライブラリについて言及していることです。

42
user2100721

私が非常におもしろいと思った上記のすべての答えの他に、それはここで議論されるように時々非常に簡単であるかもしれません: - Rで助けを得るための最小の再現可能な例を作る方法

乱数ベクトルを作成するには多くの方法があります Rの乱数を2桁に丸めた100の数のベクトルを作成します またはRの乱数行列

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

ディメンションなどのさまざまな理由で、特定のデータを共有することが非常に困難な場合があることに注意してください。ただし、元のデータと同じように代表的なデータを作成するには(OPが元のデータを共有できない場合)、次のようにデータの例を使用して情報を追加することをお勧めします。

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

さらに、 データ構造 になり得るデータのタイプ、長さ、および属性を知っている必要があります。

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

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

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

mt1022が述べたように 、 "最小の再現可能な例を生成するための良いパッケージは " replx " from tidyverse ".

によると Tidyverse

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

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

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

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

27
andrii

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

  • デフォルトのRデータセットを使ってみる
  • 自分のデータセットがある場合は、それらをdputと一緒に含めます。そうすれば、他の人がより簡単に役立つことがあります。
  • 本当に必要な場合以外はinstall.package()を使用しないでください。requireまたはlibraryを使用するかどうかを人々は理解するでしょう
  • 簡潔になろう

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

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

24
TheRimalaya

testthatパッケージの関数を使って何が起きるのかを見せるのは良い考えです。したがって、他の人がエラーなく実行されるまでコードを変更することができます。これは、あなたがあなたの手助けをしたい人の負担を軽減します。なぜなら、彼らはあなたのテキストの説明を解読する必要がないからです。例えば

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

「yが10以上の場合はxが1.23、そうでない場合は3.21になると思いますが、どちらも結果が得られません」よりも明確です。このばかげた例でも、コードは単語よりも明確だと思います。 testthatを使うことであなたのヘルパーはコードに集中することができ、それは時間を節約します、そしてそれは彼らがそれを投稿する前に彼らがあなたの問題を解決したことを知る方法を提供します

14
dank