同僚とパフォーマンスについて話し合う、教える、バグ報告を送る、あるいはメーリングリストそしてここではStack Overflowに関するガイダンスを検索するときは、 再現可能な例 がよく尋ねられ、いつも役に立ちます。
優れた例を作成するためのヒントは何ですか? r のデータ構造をテキスト形式で貼り付けるにはどうすればよいですか。他にどのような情報を含めるべきですか?
dput()
、dump()
またはstructure()
を使用する以外に他のトリックがありますか?いつlibrary()
またはrequire()
ステートメントを含めるべきですか? c
、df
、data
などに加えて、どの予約語を避けるべきですか。
どうやって r の再現可能な例を作るのでしょうか。
再現可能な最小限の例は、次の項目で構成されています。
set.seed()
で設定)使用されている関数のヘルプファイルの例を見てみると役に立つことがよくあります。一般に、そこに示されているすべてのコードは、再現可能な最小限の例(データが提供され、最小限のコードが提供され、すべてが実行可能なもの)の要件を満たしています。
ほとんどの場合、これはいくつかの値を持つベクトル/データフレームを提供するだけで簡単に実行できます。または、ほとんどのパッケージで提供されている組み込みデータセットの1つを使用することもできます。
組み込みデータセットの包括的なリストはlibrary(help = "datasets")
で見ることができます。すべてのデータセットには簡単な説明があり、たとえば?mtcars
を使ってより多くの情報を得ることができます。ここで 'mtcars'はリスト内のデータセットの1つです。他のパッケージは追加のデータセットを含むかもしれません。
ベクトルを作るのは簡単です。時にはそれに何らかのランダム性を加えることが必要であり、それをするための関数がたくさんあります。 sample()
はベクトルを無作為化するか、またはほんの少しの値で無作為ベクトルを与えることができます。 letters
はアルファベットを含む便利なベクトルです。これは要因を作るために使用することができます。
いくつかの例:
x <- rnorm(10)
、一様分布の場合はx <- runif(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.factor
、as.Date
、as.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.table
のtext
パラメータを使用して読み込むことができるテキスト表現を指定できます。
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バージョンとオペレーティングシステムだけで十分です。パッケージと衝突が発生したとき、sessionInfo()
の出力を与えることは本当に役に立ちます。他のアプリケーションへの接続について(ODBCまたはその他のものを介して)話すときは、それらのバージョン番号と、可能であれば設定に関する必要な情報も提供する必要があります。
rstudioapi::versionInfo()
を使用して R Studio でRを実行している場合は、RStudioのバージョンを報告するのに役立ちます。
特定のパッケージに問題があるなら、packageVersion("name of the package")
の出力を与えることによってパッケージのバージョンを提供したいかもしれません。
(これは からの私のアドバイスです。 - 再現可能な例の書き方 。短くしても甘いものにしようとしました)
再現可能な例を提供するならば、あなたはあなたのR問題に関して良い助けを得る可能性が最も高いです。再現可能な例では、Rコードをコピーして貼り付けるだけで、他の人があなたの問題を再現することができます。
例を再現可能にするために含める必要があるものが4つあります。必要なパッケージ、データ、コード、およびR環境の説明です。
パッケージ はスクリプトの先頭にロードする必要があるので、例に必要なものは簡単にわかります。
電子メールまたはStack Overflowの質問に data を含める最も簡単な方法は、dput()
を使用してそれを再作成するためのRコードを生成することです。たとえば、Rでmtcars
データセットを再作成するには、次の手順を実行します。
dput(mtcars)
を実行するmtcars <-
と入力して貼り付けます。あなたの code が他の人にとって読みやすいように少し時間をかけてください:
スペースを使用し、変数名は簡潔にしてください。
あなたの問題がどこにあるかを示すためにコメントを使う
問題に関連しないものはすべて削除するように最善を尽くします。
コードが短くなればなるほど、理解しやすくなります。
コードのコメントにsessionInfo()
の出力を含めます。これはあなたの R環境 をまとめたもので、古いパッケージを使っているかどうかをチェックするのを簡単にします。
新しいRセッションを起動してスクリプトを貼り付けることで、再現可能な例を実際に作成したことを確認できます。
すべてのコードをEメールに入れる前に、 Gist github に置くことを検討してください。それはあなたのコードに素敵な構文の強調表示を与えるでしょう、そしてあなたは電子メールシステムによって何かがおかしくなるのを心配する必要はありません。
個人的には、私は "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")
この非常にポストに触発されて、私は今便利な機能を使います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
出力を作成しますobjName <- ...
を追加しますが、...# 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質問の投稿を読みやすくなり、コピー+貼り付けも簡単になります。
これで、テキスト出力の何行分を使用するかを指定できます(つまり、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==
これは良いガイドです:
http://www.r-bloggers.com/three-tips-for-posting-good-questions-to-r-help-and-stack-overflow/ /
しかし、最も重要なことは以下のとおりです。問題が何であるかを確認するために実行できる小さなコードを作成してください。これに便利な関数はdput()
ですが、非常に大きなデータがある場合は、小さなサンプルデータセットを作成するか、最初の10行程度を使用します。
編集:
また、問題が自分自身である場所を特定したことを確認してください。例は、「200行目にエラーがあります」というRスクリプト全体であってはなりません。 R(browser()
が大好き)やgoogleのデバッグツールを使うなら、問題がどこにあるのかを実際に識別し、同じことが間違っているような簡単な例を再現できるはずです。
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 の再現可能な例を目指してください。これは、問題を説明するためにデータとコードができるだけ単純であることを意味します。
編集:きれいなコードは醜いコードよりも読みやすいです。 スタイルガイド を使用してください。
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
")
たとえどんなに難しいことをしても、問題が実際には小さいデータで再現できないことや、合成データでは起こらないことがあります(ただし、{notした合成データセットを作成する方法を示すことは役立ちます) _いくつかの仮説を除外しているので、問題を再現してください。
あなたがこれらのどちらもすることができないなら、あなたはおそらくあなたの問題を解決するためにコンサルタントを雇う必要があります...
編集:匿名化/スクランブリングに役立つ2つのSO質問:
これまでの答えは明らかに再現性の部分にとって素晴らしいものです。これは単に再現可能な例が問題の唯一の構成要素ではあり得ないことを明確にするためです。どのように見せたいのか、問題の輪郭を説明することを忘れないでください。コードが足りません。あなたは言葉も必要です。
これは避けるべきことの再現可能な例です(実際の例から抜粋した、名前は無実を保護するために変更されました):
以下はサンプルデータと私が困った機能の一部です。
code
code
code
code
code (40 or so lines of it)
どうすればこれを達成できますか?
私は上で言及されていないRの例を作るための非常に簡単で効率的な方法があります。あなたの構造を最初に定義することができます。例えば、
mydata <- data.frame(a=character(0), b=numeric(0), c=numeric(0), d=numeric(0))
>fix(mydata)
それからあなたは手動であなたのデータを入力することができます。これは大きな例よりも小さい例には効果的です。
あなたのデータのdput
を素早く作成するために、あなたはあなたのクリップボードにデータ(の一部)をコピーしてRで以下を実行することができます:
excelのデータの場合:
dput(read.table("clipboard",sep="\t",header=TRUE))
テキストファイルのデータの場合:
dput(read.table("clipboard",sep="",header=TRUE))
必要ならば後者でsep
を変更することができます。これはあなたのデータがもちろんクリップボードにある場合にのみ機能します。
あなたの質問を作成するあなたの主な目的は読者が彼らのシステムであなたの問題を理解し再現することをできるだけ簡単にすることであるべきです。そうするには:
これはいくらかの作業を必要としますが、あなたが他の人にあなたのために作業をするよう求めているので、公正なトレードオフのように見えます。
最善の選択肢 はるかに は組み込みのデータセットに頼ることです。これは他人があなたの問題に取り組むのを非常に簡単にします。利用可能なデータを確認するには、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
を使用してデータオブジェクトをRコードに変換できます(例:dput(myData)
)。 dput
の出力はしばしば扱いにくく、コピー&ペーストが面倒で、残りの質問をあいまいにするので、私は「最後の手段」と言います。
誰かがかつて言った:
予想される出力の写真は1000語の価値があります
- 非常に賢い人
あなたが "私はこの結果を得ることを期待した"のような何かを追加することができれば:
cyl mean.hp
1: 6 122.28571
2: 4 82.63636
3: 8 209.21429
あなたの質問には、人々はあなたがやろうとしていることを素早く理解する可能性がはるかに高いです。あなたの予想される結果が大きくて扱いにくい場合、あなたはおそらくあなたの問題を単純化する方法について十分に考えていませんでした(次を見てください)。
あなたがあなたの質問をする前にするべき主なことはあなたの問題をできるだけ単純化することです。問題を組み込みデータセットで機能するように再構築することは、この点で大いに役立ちます。また、単純化のプロセスを通過するだけで、自分の問題に答えることができることもよくあります。
これは良い質問の例です。
どちらの場合も、ユーザーの問題は、それらが提供する単純な例にはほとんどありません。むしろ彼らは彼らの問題の性質を抽象化し、彼らの質問をするためにそれを単純なデータセットに適用した。
この回答は、私がベストプラクティスであると思うものに焦点を当てています。組み込みデータセットを使用し、その結果として期待されるものを最小限の形式で提供します。最も顕著な答えは他の側面に焦点を当てています。この答えが目立つようになるとは思わない。これはもっぱらここにあるので私は初心者の質問へのコメントでそれにリンクすることができます。
再現可能なコードは助けを得るための鍵です。ただし、自分のデータのチャンクでさえも貼り付けることに懐疑的なユーザーが多数います。たとえば、機密データを使用したり、調査論文で使用するために収集された元のデータを使用したりします。何らかの理由で、私はそれを公に貼り付ける前に私のデータを「変形する」ための便利な機能を持つことは素晴らしいことだと思いました。パッケージ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
例としていくつかのデータが必要になることがよくありますが、正確なデータを投稿したくはありません。確立されたライブラリ内の既存のdata.frameを使用するには、dataコマンドを使用してそれをインポートします。
例えば。、
data(mtcars)
それから問題をやりなさい
names(mtcars)
your problem demostrated on the mtcars data set
再現可能なデータを素早く共有するために 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
.. ... ... ... ... ... ... ... ...
dput(head(mydata))
で再現可能にしたいデータに1つ以上のfactor
変数がある場合は、それにdroplevels
を追加して、最小化されたデータセットに存在しない要因のレベルがdput
の出力に含まれないようにします。例を作るために minimal :
dput(droplevels(head(mydata)))
http://old.r-fiddle.org/ /リンクが問題を共有するための非常にきちんとした方法になるかどうか私は疑問に思います。それはのようなユニークなIDを受け取り、それをSOに埋め込むことさえ考えられます。
このようにコンソールの出力を貼り付けないでください。
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つ重要なことは、特定のパッケージの関数を使用したことがある場合は、そのライブラリについて言及していることです。
私が非常におもしろいと思った上記のすべての答えの他に、それはここで議論されるように時々非常に簡単であるかもしれません: - 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))
Representx を使用してこれを行うことができます。
mt1022が述べたように 、 "最小の再現可能な例を生成するための良いパッケージは " replx " from tidyverse ".
によると Tidyverse :
"Representx"の目的は、問題のあるコードを他の人が実行して痛みを感じることができるようにパッケージ化することです。
例は tidyverse webサイトにあります。
library(reprex)
y <- 1:4
mean(y)
reprex()
再現可能な例を作成するには、これが 最も簡単な方法 であると思います。
これが私の提案のいくつかです:
dput
と一緒に含めます。そうすれば、他の人がより簡単に役立つことがあります。install.package()
を使用しないでください。require
またはlibrary
を使用するかどうかを人々は理解するでしょう簡潔になろう
これらはすべて再現可能な例の一部です。
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
を使うことであなたのヘルパーはコードに集中することができ、それは時間を節約します、そしてそれは彼らがそれを投稿する前に彼らがあなたの問題を解決したことを知る方法を提供します