如何做一个伟大的R可重现的例子?

在讨论与同事的performance,教导,发送错误报告或在邮件列表上寻找指导时,在这里,一个可复制的例子往往被问及,总是有帮助的。

你有什么build议创build一个很好的例子? 如何从文本格式粘贴r的数据结构? 你应该包括哪些其他信息?

除了使用dput()dump()或者structure()之外,还有其他的技巧吗? 何时应该包含library()require()语句? 除了cdfdata等之外,还应该避开哪些保留字?

如何做一个伟大的可重复的例子?

一个最小可重复的例子包括以下几项:

  • 一个最小的数据集,是重现错误所必需的
  • 重现错误所需的最小运行代码,可以在给定数据集上运行。
  • 关于使用的软件包,R版本以及运行的系统的必要信息。
  • 在随机过程的情况下,种子(由set.seed()设置)用于重现性

查看使用函数的帮助文件中的示例通常是有帮助的。 一般来说,在那里给出的所有代码都满足一个最小可重现的例子的要求:提供数据,提供最less的代码,并且一切都可运行。

生成一个最小的数据集

对于大多数情况下,只需提供一个具有某些值的向量/dataframe即可轻松完成。 或者您可以使用大多数软件包提供的内置数据集之一。
可以使用library(help = "datasets")查看内置数据集的完整列表。 对每个数据集都有一个简短的描述,例如,可以用?mtcars获得更多的信息,其中“mtcars”是列表中的一个数据集。 其他软件包可能包含额外的数据集。

制作vector很简单。 有时候有必要给它增加一些随机性,并且有一些function可以做到这一点。 sample()可以随机化一个向量,或者给一个只有less数值的随机向量。 letters是一个有用的vector包含字母表。 这可以用于制造因素。

几个例子:

  • 随机值: x <- rnorm(10)为正态分布, x <- runif(10)为均匀分布,…
  • 一些值的置换: x <- sample(1:10)以vector1:10为随机顺序。
  • 一个随机因子: x <- sample(letters[1:4], 20, replace = TRUE)

对于matrix,可以使用matrix() ,例如:

 matrix(1:10, ncol = 2) 

制作dataframe可以使用data.frame()来完成。 要注意在数据框中input条目的名称,而不要使其过于复杂。

一个例子 :

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

对于某些问题,可能需要特定的格式。 对于这些,可以使用任何提供的as.someType函数: as.factoras.Dateas.xts ,…这些与vector和/或数据框架技巧结合使用。

复制你的数据

如果你有一些数据太难以使用这些技巧来构build,那么你总是可以使用head()subset()或索引来创build原始数据的subset() 。 然后使用例如。 dput()给我们一些可以立即放入R的东西:

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

如果您的数据框架具有许多级别的因素,则输出输出可能会很笨重,因为它仍将列出所有可能的因素级别,即使它们不在您的数据的子集中。 要解决这个问题,可以使用droplevels()函数。 注意下面的物种是如何只有一个级别的因素:

 > 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警告是它不适用于keyed data.table对象或tbl_df的分组tbl_df (class grouped_df )。 在这些情况下,您可以在共享之前将其转换回常规dataframe, dput(as.data.frame(my_data))

在最坏的情况下,您可以使用read.tabletext参数来读取文本表示forms:

 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) 

生成最小的代码

这应该是容易的部分,但往往不是。 你不应该做的是:

  • 添加所有types的数据转换。 确保提供的数据已经是正确的格式(除非这是当然的问题)
  • 复制粘贴整个function/块的代码,给出一个错误。 首先,尝试找出哪些行会导致错误。 往往你会发现自己的问题是什么。

你应该做的是:

  • 添加哪些包应该使用,如果你使用任何。
  • 如果打开连接或生成文件,请添加一些代码来closures它们或删除文件(使用unlink()
  • 如果您更改选项,请确保代码包含语句以将其恢复为原始语句。 (例如op <- par(mfrow=c(1,2)) ...some code... par(op)
  • testing运行你的代码在一个新的空的R会话,以确保代码是可运行的。 人们应该能够在控制台中复制粘贴数据和代码,并且完全像现在一样。

提供额外的信息

在大多数情况下,只有R版本和操作系统就足够了。 当包发生冲突时,给出sessionInfo()的输出可以真正帮助。 在讨论与其他应用程序的连接时(通过ODBC或其他方式),还应该为这些应用程序提供版本号,如果可能的话还提供有关安装的必要信息。

如果您使用rstudioapi::versionInfo()R Studio中运行R,可能会有助于报告您的RStudio版本。

如果您遇到特定软件包的问题,​​则可以通过提供packageVersion("name of the package")的输出packageVersion("name of the package")来提供软件包的版本。

(这是我的build议http://adv-r.had.co.nz/Reproducibility.html 。我试图让它简短但甜美)

如何写一个可重复的例子。

如果您提供一个可重现的例子,您最有可能得到R的问题很好的帮助。 一个可重现的例子允许别人通过复制和粘贴R代码来重新创build您的问题。

为了使您的示例具有可重现性,您需要包含以下四项内容:所需的软件包,数据,代码和R环境的描述。

  • 软件包应该被加载到脚本的顶部,所以很容易看到哪个例子需要。

  • 在电子邮件或堆栈溢出问题中包含数据的最简单方法是使用dput()生成R代码以重新创build它。 例如,要重新创buildR中的mtcars数据集,我会执行以下步骤:

    1. 在R中运行dput(mtcars)
    2. 复制输出
    3. 在我可重复的脚本中,键入mtcars <-然后粘贴。
  • 花一点时间确保您的代码易于其他人阅读:

    • 确保你已经使用空格,你的variables名称简洁明了,但是信息丰富

    • 用评论来表明你的问题在哪里

    • 尽你所能去除与问题无关的一切。
      代码越短越容易理解。

  • sessionInfo()的输出包含在代码的注释中。 这总结了您的R环境,并可以很容易地检查您是否使用过期的软件包。

你可以通过启动一个新的R会话并粘贴你的脚本来检查你是否有一个可重复的例子。

在将所有代码放入电子邮件之前,请考虑将其放在http://gist.github.com/上; 。 它会给你的代码提供很好的语法高亮,而且你不必担心任何被电子邮件系统弄坏的东西。

就个人而言,我更喜欢“一个”衬垫。 沿线的东西:

 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) 

数据结构应该模仿作者问题的思想,而不是确切的逐字logging结构。 我真的很感激variables不覆盖我自己的variables或上帝禁止,function(如df )。

或者,可以切割一些angular落,并指向预先存在的数据集,如下所示:

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

不要忘记提及您可能使用的任何特殊软件包。

如果你想在大的物体上展示一些东西,你可以尝试

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

如果您通过raster软件包处理空间数据,则可以生成一些随机数据。 包装小插图中可以find很多例子,但这里有一个小块。

 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 shapefile)获取一些数据集(请参阅任务视图中的空间视图)。

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

受此启发,我现在使用一个方便的function
reproduce(<mydata>)当我需要发布到StackOverflow。


快速说明

如果myData是要重现的对象的名称,请在R中运行以下命令:

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

细节:

这个函数是一个input的智能包装,并执行以下操作:

  • 自动采样一个大的数据集(基于大小和类别,样本大小可以调整)
  • 创build一个输出输出
  • 允许您指定要导出的列
  • 附加到它的前面objName <- ...以便它可以很容易地复制+粘贴,但…
  • 如果在Mac上工作,输出会自动复制到剪贴板,以便您可以简单地运行它,然后粘贴到您的问题。

来源可在这里find:


例:

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

还要注意,整个输出是一个很好的单一,长线,而不是一个高高的段落。 这使得在SO问题文章上阅读更容易,也更容易复制+粘贴。


2013年10月更新:

您现在可以指定多less行文本输出将占用(即,您将粘贴到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() ,但是如果你有非常大的数据,你可能想创build一个小样本数据集,或者只使用前10行左右。

编辑:

还要确保你确定问题出在哪里。 该示例不应该是一个完整的R脚本与“在线200有一个错误”。 如果你使用R(我爱browser() )和谷歌的debugging工具,你应该能够真正确定问题的地方,并重现一个微不足道的例子,在同样的事情出错。

R帮助邮件列表有一个发布指南 ,其中包括提问和回答问题,其中包括生成数据的示例:

示例:有时候可以帮助提供一个可以真正运行的小例子。 例如:

如果我有一个matrixx如下:

  > x <- matrix(1:8, nrow=4, ncol=2, dimnames=list(c("A","B","C","D"), c("x","y")) > x xy A 1 5 B 2 6 C 3 7 D 4 8 > 

我怎样才能把它变成一个数据框,它有8行,3列名为'row','col'和'value',它们的维度名称是'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") 

小字这个词特别重要。 您应该瞄准一个最小可重现的例子,这意味着数据和代码应该尽可能简单地解释问题。

编辑:漂亮的代码比丑陋的代码更容易阅读。 使用风格指南 。

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

有时候这个问题实际上无法用较小的数据重现,不pipe你怎么努力,并且不会发生在合成数据上(虽然这对于显示你如何生成并不能重现问题的合成数据集是有用的,因为它排除了一些假设)。

  • 将数据发布到networking上并提供URL可能是必要的。
  • 如果数据不能公开发布给大家,但是可以共享,那么你可以通过电子邮件的forms发送给感兴趣的各方(尽pipe这样会减less那些打扰工作的人数在上面)。
  • 实际上我没有看到这一点,因为无法发布数据的人对于以任何forms发布数据都非常敏感,但是在某些情况下,如果数据足够匿名/混乱/损坏,仍然可以发布数据某种程度上来说。

如果你不能做这两个,那么你可能需要聘请一个顾问来解决你的问题…

编辑 :匿名/加扰两个有用的SO问题:

  • 如何从私人数据创build示例数据集(使用不具名的占位符replacevariables名称和级别)?
  • 给定从连续单variables分布中抽取的一组随机数,find分布

迄今为止的答案对于可重复性部分显然是很大的。 这只是为了澄清一个可重复的例子不能也不应该成为问题的唯一组成部分。 不要忘了解释你想要的样子和问题的轮廓,而不仅仅是你如何尝试到目前为止。 代码是不够的; 你也需要文字。

这里有一个可以避免的做法的例子(从一个真实的例子中,名字被改变来保护无辜):


以下是示例数据和我遇到麻烦的部分function。

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

我怎样才能做到这一点?


要快速创build数据的dput ,只需将(一部分)数据复制到剪贴板,然后在R中运行以下命令:

在Excel中的数据:

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

对于txt文件中的数据:

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

如有必要,你可以改变后者。 这只有当你的数据在剪贴板中才有效。

我有一个非常简单有效的方法来创build一个上面没有提到的R例子。 你可以先定义你的结构。例如,

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

当你执行'fix'命令时,你会得到这个弹出框

那么你可以手动input你的数据。这对于较小的例子而不是大的例子是有效的。

可重复的代码是获得帮助的关键。 但是,有很多用户可能会怀疑粘贴他们的数据。 例如,他们可能正在处理敏感数据或收集在研究论文中使用的原始数据。 出于任何原因,我认为在公开粘贴之前有一个方便的function来“变形”我的数据是很好的。 来自包SciencesPoanonymize函数是非常愚蠢的,但对我来说,它与dput函数很好地dput

 install.packages("SciencesPo") dt <- data.frame( Z = sample(LETTERS,10), X = sample(1:10), Y = sample(c("yes", "no"), 10, replace = TRUE) ) > dt ZXY 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) ZXY 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 

在应用匿名和input命令之前,也可能想要采样一些variables而不是整个数据。

  # sample two variables without replacement > anonymize(sample.df(dt,5,vars=c("Y","X"))) YX 1 a1 -0.4 2 a1 0.6 3 a2 -2.4 4 a1 -1.4 5 a2 3.6 

通常你需要一些数据作为例子,但是,你不想发布你的确切数据。 要在已build立的库中使用某些现有的data.frame,请使用data命令导入它。

例如,

 data(mtcars) 

然后做这个问题

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

指南:


制定问题的主要目标应该是让读者尽可能容易地理解和重现您系统中的问题。 要做到这一点:

  1. 提供input数据
  2. 提供预期的产出
  3. 简洁地解释你的问题
    • 如果你有超过20行的文本+代码,你可以回头简化
    • 尽可能简化您的代码,同时保留问题/错误

这确实需要一些工作,但似乎是一个公平的权衡,因为你要求别人为你工作。

提供数据:


内置数据集

目前最好的select是依靠内置的数据集。 这使得其他人很容易处理你的问题。 在R提示符处键入data()以查看可用的数据。 一些经典的例子:

  • iris
  • mtcars
  • ggplot2::diamonds (外部包,但几乎每个人都有)

看到这个SO QA如何find适合您的问题的数据集。

如果你能够改变你的问题来使用内置的数据集,你很可能会得到很好的答案(和upvotes)。

自生数据

如果您的问题对于现有数据集中没有表示的数据types非常具体,请提供R代码,该代码可以生成您的问题所performance出来的最小可能数据集。 例如

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

现在有人试图回答我的问题可以复制/粘贴这两行,并立即开始解决问题。

dput

作为最后的手段 ,您可以使用dput将数据对象转换为R代码(例如dput(myData) )。 我说这是“最后的手段”,因为输出的输出dput是相当笨拙的,烦人的复制粘贴,并模糊了你的问题的其余部分。

提供预期的输出:


有人曾经说过:

预期输出的图片值1000字

– 一个非常聪明的人

如果你可以添加“我期望得到这个结果”这样的东西:

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

对于你的问题,人们更有可能很快理解你正在做的事情。 如果您的预期结果很大且笨重,那么您可能对如何简化问题没有足够的认识(见下文)。

简洁地解释你的问题


要做的主要事情就是在提出问题之前尽可能简化您的问题。 重新构build问题以使用内置数据集将在这方面提供很多帮助。 你也会经常发现,只要经历简化过程,你就会回答你自己的问题。

以下是一些很好的问题的例子:

  • 内置数据集
  • 与用户生成的数据

在这两种情况下,用户的问题几乎肯定不是他们提供的简单例子。 相反,他们抽象了他们的问题的性质,并将其应用于一个简单的数据集来问他们的问题。

为什么还有这个问题的答案?


这个答案侧重于我认为是最佳实践:使用内置的数据集,并以最小的forms提供您期望的结果。 最突出的答案集中在其他方面。 我不认为这个答案会突然出现, 这里仅仅是为了让我可以链接到新手问题的评论。

如果使用dput()方法无法轻松地将大数据集放到脚本中,请将数据发布到pastebin并使用read.table加载它们:

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

受@Henrik启发。

我正在开发wakefield软件包来解决这个需求,以便快速共享可重复的数据,有时候dput对于较小的数据集工作正常,但是我们处理的许多问题要大得多,通过dput共享如此庞大的数据集是不切实际的。

关于:

唤醒允许用户共享最less的代码来重现数据。 用户设置n (行数),并指定任意数量的预设variables函数(目前有70个)模拟真实的数据(如性别,年龄,收入等)

安装:

目前(2015-06-11), wakefield是一个GitHub包,但最终会在unit testing完成后进入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 .. ... ... ... ... ... ... ... ... 

如果数据中有一个或多个factorvariables需要用dput(head(mydata))进行重现,则考虑droplevels添加小droplevels以使最小化数据集中不存在的因子水平为不包括在你的dput输出中,为了使例子最小化

 dput(droplevels(head(mydata))) 

我不知道一个http://www.r-fiddle.org/链接可以是一个非常干净的分享问题的方式。; 它会收到一个唯一的ID,甚至可以考虑将其embedded到SO中。

http://www.r-fiddle.org/#/help

请不要粘贴你的控制台输出:

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

还有一件事,如果你已经使用了某个包的任何function,请提一下这个库。

以下是我的一些build议:

  • 尝试使用默认的R数据集
  • 如果您有自己的数据集,请将其包含dput ,以便其他人可以更轻松地为您提供帮助
  • 除非真的有必要,否则不要使用install.package() ,如果你只是使用require或者library ,人们会明白
  • 尽量简洁,

    • 有一些数据集
    • 尽可能简单地描述你所需要的输出
    • 在提出问题之前自己动手
  • 上传图片很容易,所以如果有上传图片的话
  • 还包括你可能有的任何错误

所有这些都是可重现的例子的一部分。

Apart of all above answers which I found very interesting, it could sometimes be very easy as it is discussed here
http://www.dummies.com/how-to/content/how-to-make-a-minimal-reproducible-example-to-get-.html

There are many ways to make a random vector Create a 100 number vector with random values in R rounded to 2 decimals or random matrix in R

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

Note that sometimes it is very difficult to share a given data because of various reasons such as dimension etc. However, all above answers are great and very important to think and use when one wants to make a reproducible data example. But note that in order to make a data as representative as the original (in case the OP cannot share the original data), it is good to add some information with the data example as (if we call the data mydf1)

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

Moreover, one should know the type, length and attributes of a data which can be http://adv-r.had.co.nz/Data-structures.html

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

It's a good idea to use functions from the testthat package to show what you expect to occur. Thus, other people can alter your code until it runs without error. This eases the burden of those who would like to help you, because it means they don't have to decode your textual description. 例如

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

is clearer than "I think x would come out to be 1.23 for y equal to or exceeding 10, and 3.21 otherwise, but I got neither result". Even in this silly example, I think the code is clearer than the words. Using testthat lets your helper focus on the code, which saves time, and it provides a way for them to know they have solved your problem, before they post it

You can do this using reprex .

As mt1022 noted , "… good package for producing minimal, reproducible example is "reprex" from tidyverse ".

According to Tidyverse :

The goal of "reprex" is to package your problematic code in such a way that other people can run it and feel your pain.

An example is given on tidyverse web site.

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

I think this is the simplest way to create a reproducible example.