这需要一些工作,但似乎是一个公平的交换,因为您要求别人为您工作。
迄今为止最好的选择是依赖于内置数据集。这使得其他人很容易处理您的问题。在R提示符下键入data()
以查看可用的数据。一些经典的例子:
iris
mtcars
ggplot2::diamonds
(外部包,但几乎每个人都有它)如果您可以重新构思问题以使用内置数据集,则更有可能获得良好的答案(和赞同)。
如果您的问题特定于现有数据集中未表示的某种数据类型,请提供生成问题最小数据集的R代码。例如:
set.seed(1) # important to make random data reproducible
myData <- data.frame(a=sample(letters[1:5], 20, rep=T), b=runif(20))
如果有人想回答我的问题,可以复制/粘贴这两行代码并立即开始解决问题。
作为最后的手段,您可以使用dput
将数据对象转换为R代码(例如dput(myData)
)。我之所以说作为“最后的手段”,是因为dput
的输出通常相当笨重,难以复制/粘贴,并且会遮盖您问题的其余部分。
曾经有人说:
一张期望输出的图片胜过千言万语
-- 一位智者
如果你能添加类似于“我期望得到这个结果”的东西:
cyl mean.hp
1: 6 122.28571
2: 4 82.63636
3: 8 209.21429
在提问之前,最重要的是尽可能地简化你的问题。将问题重新构建为适用于内置数据集的形式可以在很大程度上帮助解决这个问题。此外,仅通过简化过程,您通常会发现自己已经回答了自己的问题。
以下是一些好问题的示例:
在这两种情况下,用户的问题几乎肯定不是针对他们提供的简单示例。相反,他们将其问题的本质抽象出来,并应用到一个简单的数据集中来提问。
dput
,您可以将数据的(一部分)复制到剪贴板中,并在R中运行以下内容:dput(read.table("clipboard", sep="\t", header=TRUE))
对于一个 .txt 文件中的数据:
dput(read.table("clipboard", sep="", header=TRUE))
sep
。当然,这仅在您的数据在剪贴板中时才有效。SciencesPo
包的anonymize
函数非常愚蠢,但对我来说,它与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命令导入它。
e.g.,
data(mtcars)
然后解决问题
names(mtcars)
your problem demostrated on the mtcars data set
mtcars
和iris
数据集)实际上不需要使用data
函数调用。 - Gregor Thomas我正在开发 wakefield 包,以解决快速共享可重现数据的需求。虽然 dput
对于较小的数据集效果很好,但我们处理的许多问题都涉及更大的数据集,在 dput
中共享如此大的数据集是不切实际的。
关于:
wakefield 允许用户分享最少的代码来重现数据。用户设置行数(n
)并指定任意数量的预设变量函数(当前有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
.. ... ... ... ... ... ... ... ...
如果您的数据中有一个或多个factor
变量,您希望用dput(head(mydata))
使其可复制,请考虑添加droplevels
,以便在最小化数据集中不存在的因子水平不包括在您的dput
输出中,以便使示例尽可能小:
dput(droplevels(head(mydata)))
原帖提到了现已退役的DataCamp r-fiddle服务。它已被重新品牌为DataCamp Light,不能像我的答案所示那样轻松地嵌入。
我想知道是否可以使用http://old.r-fiddle.org/链接来分享问题,这可能是一个非常简洁的方法。它接收一个唯一的ID,甚至可以考虑将其嵌入到 Stack Overflow 中。
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")
还有一件事,如果您使用了某个包中的任何函数,请提到该库。
>
并添加 #
吗?还是有自动的方式来完成这个操作? - BCArg>
替换为#
。只需将文本粘贴到编辑器中,然后点击编辑器窗格顶部的搜索图标。在搜索输入框中输入>
,在替换输入框中输入#
,然后点击“全部替换”按钮即可。 - Abednego Nasila您可以使用reprex来完成这个任务。
正如mt1022指出的那样,"... 用于生成最小可重现示例的好包是来自tidyverse"的"reprex"。
根据Tidyverse:
"reprex"的目标是以这样的方式打包您的问题代码,以便其他人可以运行它并感受到您的痛苦。
在tidyverse网站上提供了一个示例。
library(reprex)
y <- 1:4
mean(y)
reprex()
我认为这是创建可重复示例的最简单方法。
reprex()
之前,您需要将代码复制到剪贴板中,因为这是它获取代码的位置。 - Dr_Be