Как сделать отличный пример R воспроизводимым

при обсуждении производительности с коллегами, преподавании, отправке отчета об ошибке или поиске руководства по спискам рассылки и здесь при переполнении стека a воспроизводимый пример часто задаваемые и всегда полезно.

каковы Ваши советы по созданию отличного примера? Как вставить структуры данных из r в текстовом формате? Какую еще информацию следует включить?

есть ли другие приемы, в дополнение к использованию dput(), dump() или structure()? Когда вы должны включить library() или require() заявления? Каких зарезервированных слов следует избегать в дополнение к c, df, data, etc.?

как сделать большой r воспроизводимый пример?

23 ответов


минимальный воспроизводимый пример состоит из следующих элементов:

  • минимальный набор данных, необходимый для воспроизведения ошибки
  • минимальный runnable код, необходимый для воспроизведения ошибки, которую можно запустить на данном наборе данных.
  • необходимая информация об используемых пакетах, версии R и системе, на которой она запускается.
  • в случае случайных процессов, семя (устанавливается set.seed()) для воспроизводимость

просмотр примеров в файлах справки используемых функций часто бывает полезным. В общем, весь приведенный там код отвечает требованиям минимального воспроизводимого примера: данные предоставлены, минимальный код предоставлен, и все работает.

создание минимального набора данных

в большинстве случаев, это можно легко сделать, просто предоставив вектор/фрейм данных с некоторых значений. Или вы можете использовать один из встроенных наборы данных, которые предоставляются с большинством пакетов.
Полный список встроенных наборов данных можно просмотреть с помощью library(help = "datasets"). Существует краткое описание каждого набора данных, и дополнительную информацию можно получить, например, с помощью ?mtcars где "mtcars" является одним из наборов данных в списке. Другие пакеты могут содержать дополнительные наборы данных.

создание вектора легко. Иногда необходимо добавить к нему некоторую случайность, и для этого существует целый ряд функций. sample() может рандомизировать вектор или дать случайный вектор только с несколькими значениями. letters является полезным вектором, содержащим алфавит. Это можно использовать для создания факторов.

несколько примеров :

  • случайные значения : x <- rnorm(10) для нормального распределения, x <- runif(10) для равномерного распределения ...
  • перестановка некоторых значений:x <- sample(1:10) для вектора 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() или индексы. Затем с помощью ЭГ. 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")

если ваш фрейм данных имеет фактор со многими уровнями, то dput выход может быть громоздким, потому что он по-прежнему будет перечислять все возможные уровни факторов даже если они не присутствуют в подмножестве ваших данных. Чтобы решить эту проблему, вы можете использовать


(вот мой совет из Как написать воспроизводимый пример . Я пытался сделать его коротким, но сладким)

Как написать воспроизводимый пример.

вы, скорее всего, получите хорошую помощь с вашей проблемой R, Если вы приведете воспроизводимый пример. Воспроизводимый пример позволяет кому-то другому воссоздать вашу проблему, просто скопировав и вставив R-код.

есть четыре вещи, которые нужно включить, чтобы сделать ваш пример воспроизводимые: необходимые пакеты, данные, код, и описание среды Р.

  • пакетов должен быть загружен в верхней части скрипта, так это легко посмотреть, какие пример должен.

  • самый простой способ включить сведения в вопросе переполнения электронной почты или стека использовать dput() создать код R для его воссоздания. Например, чтобы воссоздать mtcars набор данных в R, Я бы выполнил следующее шаги:

    1. выполнить dput(mtcars) в R
    2. скопировать вывод
    3. в моем воспроизводимый скрипт, типа mtcars <- вставить.
  • потратить немного времени сделать ваш код легко для других, чтобы читайте:

    • убедитесь, что вы использовали пробелы и ваши имена переменных кратки, но информативный

    • используйте комментарии, чтобы указать, где ваша проблема ложь!--8-->

    • сделайте все возможное, чтобы удалить все, что не связано с проблемой.
      Чем короче ваш код, тем легче его понять.

  • включить вывод sessionInfo() в комментарии в коде. Это резюмирует ваш R среды и позволяет легко проверить, используете ли вы устаревший пакет.

вы можете проверить, что вы действительно сделали воспроизводимый пример, запустив новый сеанс R и вставив свой скрипт.

прежде чем помещать весь код в электронной почте, с Gist github . Это даст вашему коду хорошую подсветку синтаксиса, и вам не придется беспокоиться о том, что что-то будет искажено системой электронной почты.


лично я предпочитаю "один" вкладыши. Что-то в этом роде:--9-->

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 пакета, вы можете создать некоторые случайные данные. Много примеров можно найти в виньетке пакета, но вот небольшой самородок.

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) в " 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 <- ... так что его можно легко скопировать+вставить, но...
  • при работе на mac вывод автоматически копируется в буфер обмена, так что вы можете просто запустить его, а затем вставить в свой вопрос.

источник доступен здесь:


пример:

# 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 questions, а также проще скопировать + вставить.


Обновление Октября 2013 Года:

теперь вы можете указать, сколько строк вывода текста займет (т. е. то, что вы вставите в StackOverflow). Используйте


вот хорошее руководство:

http://www.r-bloggers.com/three-tips-for-posting-good-questions-to-r-help-and-stack-overflow/

но самое главное: просто убедитесь, что вы сделать небольшой кусок кода, который можно запустить, чтобы увидеть, в чем проблема. Полезной функцией для этого является dput(), но если у вас очень большие данные, вы можете сделать небольшой образец набора данных или использовать только первые 10 строк или так.

EDIT:

также убедитесь, что вы определили где проблема себя. Примером не должен быть весь R-скрипт с "в строке 200 есть ошибка". Если вы используете инструменты отладки в R (I love 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
  >

как я могу превратить его в таблицу данных с 8 строками и тремя столбцами с именем 'строки', 'Коль', и "значение", которое имеют имена измерений как значения " row " и "col", например:

  > x.df
     row col value
  1    A   x      1

...
(На что можно было бы ответить:--6-->

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

)

слово маленький особенно важно. Вы должны стремиться к минимальный воспроизводимый пример, что означает, что данные и код должны быть максимально простыми для объяснения проблема.

EDIT: довольно код легче читать, чем уродливый код. Используйте гид по стилю.


Начиная С R. 2.14 (я думаю) вы можете кормить свое текстовое представление данных непосредственно для чтения.таблица:

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

Иногда проблема действительно не воспроизводима с меньшим куском данных, независимо от того, как сильно вы пытаетесь, и не происходит с синтетическими данными (хотя полезно показать, как вы произвели синтетические наборы данных, которые сделали не воспроизвести проблему, потому что она исключает некоторые гипотезы).

  • размещение данных в интернете где-то и предоставление URL-адреса может потребоваться.
  • если данные не могут быть выпущены для широкой публики, но могут поделитесь вообще, тогда вы сможете предложить отправить его по электронной почте заинтересованным лицам (хотя это сократит количество людей, которые потрудятся над ним работать).
  • Я на самом деле не видел, как это делается, потому что люди, которые не могут выпустить свои данные, чувствительны к выпуску любой формы, но было бы правдоподобно, что в некоторых случаях можно было бы по-прежнему публиковать данные, если бы они были достаточно анонимными/скремблированными/слегка повреждены.

Если вы не можете сделать но вы, вероятно, нужно нанять консультанта, чтобы решить вашу проблему ...

редактировать: два полезных вопроса SO для анонимизации / скремблирования:


ответы до сих пор, очевидно, отлично подходят для части воспроизводимости. Это просто для того, чтобы уточнить, что воспроизводимый пример не может и не должен быть единственным компонентом вопроса. Не забудьте объяснить, как вы хотите, чтобы это выглядело и контуры вашей проблемы, а не только то, как вы пытались достичь этого до сих пор. Код недостаточно, нужно слова.

вот воспроизводимый пример того, чего следует избегать (из реального примера, имена изменены на защитить невиновных):


ниже приведены примеры данных и часть функции, с которой у меня проблемы.

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

Как я могу этого достичь ?



чтобы быстро создать dput ваших данных вы можете просто скопировать (часть) данных в буфер обмена и запустить следующее В R:

для данных в Excel:

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

для данных в txt-файле:

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

вы можете изменить sep в последнем случае необходимо. Это будет работать только если ваши данные в буфере обмена, конечно.


У меня есть очень простой и эффективный способ сделать пример R, который не был упомянут выше. Сначала вы можете определить свою структуру. Например,

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

>fix(mydata)

When you execute 'fix' command, you will get this pop-up box

затем вы можете ввести свои данные вручную. Это эффективно для небольших примеров, а не для больших.


воспроизводимый код является ключевым, чтобы получить помощь. Однако есть много пользователей, которые могут скептически относиться к вставке даже куска своих данных. Например, они могут работать с конфиденциальными данными или с оригинальными данными, собранными для использования в исследовательском документе. По какой-то причине я подумал, что было бы неплохо иметь удобную функцию для "деформации" моих данных перед их публичной вставкой. The anonymize функция из пакета SciencesPo - это очень глупо, но для меня это хорошо работает с


рекомендации:


ваша главная цель в разработке ваших вопросов должна состоять в том, чтобы сделать его как можно проще для читателей, чтобы понять и воспроизвести вашу проблему в своих системах. Для этого:

  1. предоставить входные данные
  2. обеспечить ожидаемый результат
  3. объясните свою проблему кратко
    • если у вас есть более 20 строк текста + кода, Вы, вероятно, можете вернуться и упростить
    • упростить код как можно больше при сохранении проблемы / ошибки

это требует некоторой работы, но кажется справедливым компромиссом, так как вы просите других делать работу для вас.

Предоставление Данных:


встроенные наборы данных

оптимальный вариант однозначно полагаться на встроенные наборы данных. Это делает его очень легким для других, чтобы работать над вашей проблемой. Тип data() в приглашении R, чтобы увидеть, какие данные доступный для вас. Некоторые классические примеры:

  • iris
  • mtcars
  • ggplot2::diamonds (внешний пакет, но почти все есть)

посмотреть этот ТАК QA о том, как найти наборы данных, подходящие для вашей проблемы.

если вы можете перефразировать свою проблему, чтобы использовать встроенные наборы данных, вы, скорее всего, получите хорошие ответы (и upvotes).

Самогенерирующегося Данные

если ваша проблема очень специфична для типа данных, которые не представлены в существующих наборах данных, укажите код 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

как последней инстанции, вы можете использовать dput для преобразования объекта данных в код R (например,dput(myData)). Я говорю как "последнее средство", потому что выход dput часто довольно громоздкий, раздражает для копирования-вставки и затемняет остальную часть вашего вопроса.

Обеспечить Ожидаемый Результат:


кто-то однажды сказал:

изображение ожидаемого выхода стоит 1000 слов

-- очень мудрый человек

если вы можете добавить что-то вроде "Я ожидалось получить этот результат":

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

на ваш вопрос, люди, скорее всего, быстро поймут, что вы пытаетесь сделать. Если ваш ожидаемый результат большой и громоздкий, то вы, вероятно, недостаточно подумали о том, как упростить свою проблему (см. Далее).

Объясните Свою Проблему Кратко


главное, что нужно сделать, это максимально упростить вашу проблему, прежде чем задавать свой вопрос. Рефрейминга проблема работа со встроенными наборами данных очень поможет в этом отношении. Вы также часто обнаружите, что, просто пройдя через процесс упрощения, вы ответите на свою собственную проблему.

вот несколько примеров хороших вопросов:

в обоих случаях проблемы пользователя почти наверняка не с простыми примерами, которые они обеспечивать. Скорее они абстрагировали природу своей проблемы и применили ее к простому набору данных, чтобы задать свой вопрос.

Почему Еще Один Ответ На Этот Вопрос?


этот ответ фокусируется на том, что я считаю лучшей практикой: используйте встроенные наборы данных и предоставляйте то, что вы ожидаете в результате в минимальной форме. Наиболее важные ответы сосредоточены на других аспектах. Я не ожидаю, что этот ответ поднимется до какой-либо известности; это здесь исключительно для того, чтобы я мог связать с это в комментариях к вопросам новичка.


часто вам нужны некоторые данные для примера, однако вы не хотите публиковать свои точные данные. Использовать некоторые существующие данные.фрейм в установленной библиотеке, используйте команду data для его импорта.

например,

data(mtcars)

а затем выполните задачу

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

Если у вас есть большой набор данных, который нельзя легко поместить в скрипт с помощью dput(), опубликуйте свои данные в сайт Pastebin и загрузите их с помощью read.table:

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

вдохновленный @Henrik.


Я развиваю Уэйкфилд пакета для решения этой проблемы необходимо быстро обмениваться воспроизводимыми данными, иногда dput отлично работает для небольших наборов данных, но многие из проблем, с которыми мы имеем дело, намного больше, разделяя такой большой набор данных через dput нецелесообразно.

о:

Уэйкфилд позволяет пользователю делиться минимальным кодом для воспроизведения данные. Пользователь устанавливает n (количество строк) и определяет любое количество предустановленных переменных функций (в настоящее время их 70), которые имитируют реальные данные if (например, пол, возраст, доход и т. д.)

установка:

в настоящее время (2015-06-11), Уэйкфилд является пакетом 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)))

интересно, если http://old.r-fiddle.org/ ссылка может быть очень аккуратным способом поделиться проблемой. Он получает уникальный идентификатор, и можно даже подумать о его встраивании в 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")

еще одна вещь, если вы использовали какую-либо функцию из определенного пакета, упомяните эту библиотеку.


помимо всех вышеперечисленных ответов, которые я нашел очень интересными, иногда это может быть очень легко, как это обсуждается здесь: -КАК СДЕЛАТЬ МИНИМАЛЬНЫЙ ВОСПРОИЗВОДИМЫЙ ПРИМЕР, ЧТОБЫ ПОЛУЧИТЬ ПОМОЩЬ С R

есть много способов сделать случайный вектор создайте вектор 100 чисел со случайными значениями в R, округленными до 2 десятичных знаков или случайная матрица в R

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

обратите внимание, что иногда очень трудно разделить данные по разным причинам как размер etc. Однако все вышеперечисленные ответы велики и очень важны для мышления и использования, когда вы хотите сделать воспроизводимый пример данных. Но обратите внимание, что для того, чтобы сделать данные репрезентативными как оригинал (в случае, если 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))

вот некоторые из моих предложений:

  • попробуйте использовать наборы данных R по умолчанию
  • если у вас есть собственный набор данных, включите их с dput, поэтому другие могут помочь вам более легко
  • Не используйте install.package() если это действительно необходимо, люди поймут, если вы просто использовать require или library
  • постарайтесь быть кратким,

    • есть некоторые dataset
    • попробую описать выход, нужно как возможно
    • сделать это сами, прежде чем задать вопрос
  • легко загрузить изображение, поэтому загружайте сюжеты, если у вас есть
  • также включают любые ошибки, которые вы можете иметь

все это часть воспроизводимого примера.


вы можете сделать это с помощью reprex.

As mt1022 отметил, "... хороший пакет для производить минимальный, возпроизводимый пример "reprex" С tidyverse".

по данным Tidyverse:

цель "reprex" - упаковать ваш проблемный код таким образом, чтобы другие люди могли запустить его и почувствовать вашу боль.

пример приведен на tidyverse веб-сайт.

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

Я думаю, что это самый простой способ создать воспроизводимый пример.


это хорошая идея использовать функции из testthat пакета, чтобы показать, что вы ожидаете произойдет. Таким образом, другие люди могут изменять ваш код, пока он не будет работать без ошибок. Это облегчает бремя тех, кто хотел бы помочь вам, потому что это означает, что им не нужно расшифровывать ваше текстовое описание. Например

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

яснее, чем "я думаю, что x будет 1.23 для y, равного или превышающего 10, и 3.21 в противном случае, но я не получил ни одного результата". Даже в этом глупом примере, Я думаю, что код яснее слов. Используя testthat позволяет вашему помощнику сосредоточиться на коде, что экономит время, и это дает им возможность узнать, что они решили вашу проблему, прежде чем они опубликуют ее