在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
当前回答
如果您有一个大数据集,无法使用dput()轻松放入脚本,请将数据发布到pastebin并使用read.table加载它们:
d <- read.table("http://pastebin.com/raw.php?i=m1ZJuKLH")
灵感来自Henrik。
其他回答
有时,无论你如何努力,问题真的无法用较小的数据块再现,而且合成数据也不会发生(尽管展示你是如何生成没有再现问题的合成数据集是有用的,因为它排除了一些假设)。
可能需要将数据发布到web某处并提供URL。如果数据不能向公众公开,但可以共享,那么您可以通过电子邮件将其发送给感兴趣的各方(尽管这将减少需要处理的人数)。我实际上还没有看到这样做,因为无法发布数据的人对以任何形式发布数据都很敏感,但在某些情况下,如果数据在某种程度上被充分匿名/加扰/轻微损坏,人们仍然可以发布数据。
如果你不能做到这两个,那么你可能需要聘请一位顾问来解决你的问题。。。
编辑:匿名/加扰的两个有用SO问题:
如何从私有数据创建示例数据集(用无信息的占位符替换变量名称和级别)?给定一组从连续单变量分布中抽取的随机数,找到分布
除了我发现非常有趣的上述所有答案之外,有时也很容易,正如这里所讨论的:如何制作一个最小的可重复示例来获得R的帮助
有许多方法可以创建随机向量创建一个100个数字的向量,其中R中的随机值舍入为2个小数或R中的一个随机矩阵:
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))
请不要像这样粘贴控制台输出:
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")
还有一件事,如果您使用了某个包中的任何函数,请提及该库。
如果您的数据中有一个或多个因子变量,您希望使用dput(head(mydata))进行复制,请考虑向其添加droplevel,以便最小化数据集中不存在的因子级别不包含在dput输出中,以使示例最小化:
dput(droplevels(head(mydata)))
使用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可以让你的助手专注于代码,这节省了时间,并且可以让他们在发布问题之前知道他们已经解决了你的问题