2016-05-01 2 views
0

Im пытается использовать dput() для создания воспроизводимого примера с большой базой данных. База данных должна быть большой, поскольку воспроизводимый пример включает скользящие средние. Способ, которым я нашел это, включает в себя функцию reproduce, поделился здесь How to make a great R reproducible example? by @Ricardo Saporta. reproduce основан на dput() (код https://github.com/rsaporta/pubR/blob/gitbranch/reproduce.R).Невозможность создать воспроизводимый пример с помощью функции replicate/dput

library(data.table) 
library(devtools) 
source_url("https://raw.github.com/rsaporta/pubR/gitbranch/reproduce.R") 

data <- read.table("http://pastebin.com/raw/xP1Zd0sC") 
setDF(data) 
reproduce(data, rows = c(1:100)) 

Этот код создает data dataframe, а затем обеспечивает dput() выход для него. Он использует аргумент rows для вывода полного кадра данных. Однако, если я использую такой вывод для воссоздания фреймворка данных, он терпит неудачу.

Попытка выделить вывод dput() на новый dataframe приводит к неполному коду, в результате чего я должен добавить три скобки вручную в конце. И после этого я получаю следующее сообщение об ошибке: «Ошибка в представлении: аргументы подразумевают различное количество строк: 100, 61».

Не обязательно, чтобы dput() вывод reproduce без аргумента rows = c(1:100) работает нормально. Он просто не выводит полный dataframe, а скорее образец.

#This works fine 
reproduce(data) 

Также обратите внимание, что для создания этого воспроизводимого примера я использовал метод pastebin. Этот метод не заменяет метод dput() для моих целей, поскольку он терпит неудачу при попытке импортировать данные, когда в некоторых столбцах есть пробелы между словами (например, dataframes with datetime stamp).

EDIT: после некоторого дальнейшего поиска неисправностей обнаружено, что reproduce терпит неудачу, как описано выше, когда rows аргумент используется вместе с dataframe, содержащей 4 или более столбцов. Придется найти альтернативу.

Если кто-то заинтересован в тестировании этого запустите код выше, со следующими ссылками, все они содержали разное количество столбцов:

1) 100x5: http://pastebin.com/raw/xP1Zd0sC

2) 100x4: http://pastebin.com/raw/YZtetfne

3) 100x4: http://pastebin.com/raw/63Ap2bh5

4) 100x3: http://pastebin.com/raw/1vMMcMtx

5) 100x3: http://pastebin.com/raw/ziM1bYQt

6) 100x1: http://pastebin.com/raw/qxtQs5u4

+0

Попытка создать воспроизводимый пример для вопроса SO. – Krug

+0

Такая же проблема с использованием 'rows = 100'. – Krug

+0

Спасибо, Ричард. 'dput()' не позволяет указывать количество строк. По крайней мере, не упоминать об этом в своей документации. Его вывод состоит из нескольких строк в начале и нескольких в конце. Мне нужно вывести всю базу данных, а не образец. – Krug

ответ

2

Если вы просто пытаетесь dput() первые 100 строк набора данных, то вы можете просто подмножество данных только до запуска dput(). Кажется, что нет необходимости использовать связанную функцию.

dput(droplevels(head(data, 100))) ## or dput(droplevels(data[1:100,])) 

должен это сделать.

Это, однако, свойственно, что ваша попытка на reproduce() не работала. Для этого я бы поставил проблему на странице github. Вероятно, вы получите более конструктивный ответ.

Спасибо @David Arenburg за то, что напомнили мне о droplevels(). Это полезно для этой операции, если у нас есть столбцы факторов. Уровни «Leftover» будут удалены.

+0

Теперь я понимаю преимущество 'replicate' vs' dput() 'в том, что первый выводит все на одну строку, а' dput() 'требует большого количества редактирования перед совместным использованием SO. У его питти 'replicate' есть эта небольшая ошибка. – Krug

Смежные вопросы