在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
当前回答
您可以使用reprex执行此操作。
正如mt1022所指出的,“……生产最小、可重复示例的好包装是tidyverse的“reprex”。”。
根据Tidyverse的说法:
“reprex”的目标是以这样一种方式打包您的问题代码,使其他人可以运行它并感受到您的痛苦。
tidyverse网站上给出了一个示例。
library(reprex)
y <- 1:4
mean(y)
reprex()
我认为这是创建可复制示例的最简单方法。
其他回答
除了我发现非常有趣的上述所有答案之外,有时也很容易,正如这里所讨论的:如何制作一个最小的可重复示例来获得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))
可复制代码是获得帮助的关键。然而,许多用户可能对粘贴哪怕是一大块数据都持怀疑态度。例如,他们可能在处理敏感数据,或者在研究论文中使用收集的原始数据。
出于任何原因,我认为在公开粘贴数据之前,有一个方便的函数来“变形”我的数据会很好。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
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行和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")
)
“小”这个词特别重要。您应该以最小的可重复示例为目标,这意味着数据和代码应该尽可能简单地解释问题。
编辑:漂亮的代码比难看的代码更容易阅读。使用样式指南。
就我个人而言,我更喜欢“一”行。大致如下:
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))
如果通过光栅包处理空间数据,则可以生成一些随机数据。在包装小插曲中可以找到很多例子,但这里有一个小亮点。
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")
我正在开发wakefield包,以解决快速共享可复制数据的需求,有时dput对较小的数据集很好,但我们处理的许多问题要大得多,通过dput共享如此大的数据集是不切实际的。
关于:
wakefield允许用户共享最少的代码来再现数据。用户设置n(行数)并指定任意数量的预设变量函数(目前有70个),这些函数模拟真实的if数据(如性别、年龄、收入等)
安装:
目前(2015年6月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
.. ... ... ... ... ... ... ... ...