훌륭한 R 재현 가능한 예제를 만드는 방법

May 11 2011

동료들과 성과를 논의하고, 가르치고, 버그 보고서를 보내거나, 메일 링리스트와 여기 Stack Overflow에 대한 지침을 검색 할 때 재현 가능한 예제 가 자주 요청되고 항상 도움이됩니다.

훌륭한 사례를 만들기위한 팁은 무엇입니까? r의 데이터 구조를 텍스트 형식으로 어떻게 붙여 넣 습니까? 다른 어떤 정보를 포함해야합니까?

dput(), dump()또는을 ( 를) 사용하는 것 외에 다른 트릭이 structure()있습니까? 언제 library()또는 require()진술 을 포함해야 합니까? 어떤 단어를 예약해야 하나 피하고, 추가하여 c, df, data, 등?

한 사람이 어떻게 좋은 만드는가 R 재현 예를?

답변

1756 JorisMeys May 11 2011 at 18:40

최소한의 재현 예는 다음과 같은 항목으로 구성되어 있습니다 :

  • 문제를 입증하는 데 필요한 최소한의 데이터 세트
  • 주어진 데이터 세트에서 실행할 수있는 오류를 재현하는 데 필요한 최소한의 실행 가능한 코드
  • 사용 된 패키지, R 버전 및 실행되는 시스템에 대한 필수 정보.
  • 무작위 프로세스의 경우 set.seed()재현성을위한 시드 (로 설정 ) 1

좋은 예는 최소한의 재현 예 , 당신이 사용하고있는 함수의 도움말 파일을 참조하십시오. 일반적으로 여기에 제공된 모든 코드는 최소한의 재현 가능한 예의 요구 사항을 충족합니다. 데이터가 제공되고 최소한의 코드가 제공되며 모든 것이 실행 가능합니다. 또한 많은 업 보트가있는 Stack Overflow에 대한 질문을 살펴보세요.

최소한의 데이터 세트 생성

대부분의 경우 벡터 / 데이터 프레임에 일부 값을 제공하면 쉽게 수행 할 수 있습니다. 또는 대부분의 패키지와 함께 제공되는 기본 제공 데이터 세트 중 하나를 사용할 수 있습니다.
내장 데이터 세트의 포괄적 인 목록은 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(iris[1:4, ]) # first four rows of the iris data set
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경우 데이터 하위 집합에없는 경우에도 가능한 모든 요인 수준을 나열하므로 출력이 다루기 어려울 수 있습니다. 이 문제를 해결하기 위해 droplevels()기능을 사용할 수 있습니다 . 종이 하나의 수준 만있는 요인임을 아래에서 확인하십시오.

> dput(droplevels(iris[1: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 = "setosa",
class = "factor")), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

를 사용할 때 dput관련 항목 만 포함 할 수도 있습니다.

> dput(mtcars[1:3, c(2, 5, 6)]) # first three rows of columns 2, 5, and 6
structure(list(cyl = c(6, 6, 4), drat = c(3.9, 3.9, 3.85), wt = c(2.62, 
2.875, 2.32)), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710"
), class = "data.frame")

한 가지 다른주의해야 할 점은 dput이 키 입력을 위해 작동하지 않을 것입니다 data.table개체 또는 그룹화를 위해 tbl_df(클래스 grouped_df에서) dplyr. 이러한 경우 공유하기 전에 일반 데이터 프레임으로 다시 변환 할 수 있습니다 dput(as.data.frame(my_data)).

최악의 시나리오는 다음 text매개 변수를 사용하여 읽을 수있는 텍스트 표현을 제공 할 수 있습니다 read.table.

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

Data <- read.table(text=zz, header = TRUE)

최소한의 코드 생성

이것은 쉬운 부분이어야하지만 종종 그렇지 않습니다. 하지 말아야 할 것은 다음과 같습니다.

  • 모든 종류의 데이터 변환을 추가합니다. 제공된 데이터가 이미 올바른 형식인지 확인하십시오 (물론 문제가 아닌 경우)
  • 오류를 발생시키는 전체 함수 / 코드 덩어리를 복사하여 붙여 넣습니다. 먼저, 정확히 어떤 줄이 오류를 일으키는 지 찾아보십시오. 종종 문제가 무엇인지 스스로 알게 될 것입니다.

해야 할 일은 다음과 같습니다.

  • 사용하는 경우 사용해야하는 패키지 추가 (사용 library())
  • 연결을 열거 나 파일을 만드는 경우 일부 코드를 추가하여 연결을 닫거나 파일을 삭제합니다 (사용 unlink()).
  • 옵션을 변경하는 경우 코드에 원래 옵션으로 되 돌리는 명령문이 포함되어 있는지 확인하십시오. (예를 들어 op <- par(mfrow=c(1,2)) ...some code... par(op))
  • 새로운 빈 R 세션에서 코드를 테스트 실행하여 코드가 실행 가능한지 확인하십시오. 사람들은 콘솔에서 데이터와 코드를 복사하여 붙여 넣기 만하면 똑같이 얻을 수 있습니다.

추가 정보 제공

대부분의 경우 R 버전과 운영 체제만으로 충분합니다. 패키지와 충돌이 발생할 때의 출력을 제공하면 sessionInfo()정말 도움 이 될 수 있습니다. 다른 응용 프로그램에 대한 연결에 대해 이야기 할 때 (ODBC 또는 다른 것을 통해) 해당 버전 번호도 제공해야하며 가능하면 설정에 필요한 정보도 제공해야합니다.

당신이 R을 실행하는 경우 R Studio를 사용 rstudioapi::versionInfo()하여 RStudio 버전을보고 도움이 될 수 있습니다.

특정 패키지에 문제가있는 경우 packageVersion("name of the package").


1 참고 : 의 출력은 set.seed()R> 3.6.0과 이전 버전간에 다릅니다. 임의 프로세스에 사용한 R 버전을 지정하고 이전 질문을 따를 때 약간 다른 결과를 얻더라도 놀라지 마십시오. 이러한 경우 동일한 결과를 얻으려면 RNGversion()전에 -function set.seed()(예 :)을 사용할 수 있습니다 RNGversion("3.5.2").

595 hadley May 11 2011 at 20:57

( 재현 가능한 예제를 작성하는 방법 의 조언입니다 . 짧지 만 달콤하게 만들려고 노력했습니다)

재현 가능한 예를 작성하는 방법.

재현 가능한 예제를 제공하면 R 문제에 대해 좋은 도움을받을 가능성이 큽니다. 재현 가능한 예제를 사용하면 다른 사람이 R 코드를 복사하여 붙여 넣기 만하면 문제를 재현 할 수 있습니다.

예제를 재현 가능하게 만들기 위해 포함해야하는 4 가지 항목이 있습니다. 필수 패키지, 데이터, 코드 및 R 환경에 대한 설명입니다.

  • 패키지 는 스크립트 맨 위에로드되어야하므로 예제에 필요한 패키지 를 쉽게 확인할 수 있습니다.

  • 이메일 또는 Stack Overflow 질문에 데이터 를 포함하는 가장 쉬운 방법 dput()은 R 코드를 생성하여 다시 만드는 것입니다. 예를 들어 mtcarsR 에서 데이터 세트 를 다시 생성 하려면 다음 단계를 수행합니다.

    1. dput(mtcars)R에서 실행
    2. 출력 복사
    3. 재현 가능한 스크립트에 입력 mtcars <-한 다음 붙여 넣습니다.
  • 다른 사람들이 코드 를 쉽게 읽을 수 있도록 약간의 시간을 할애하십시오 .

    • 공백을 사용했는지, 변수 이름이 간결하지만 유익한 지 확인하십시오.

    • 주석을 사용하여 문제가 어디에 있는지 표시하십시오.

    • 문제와 관련이없는 모든 것을 제거하기 위해 최선을 다하십시오.
      코드가 짧을수록 이해하기 쉽습니다.

  • sessionInfo()코드의 주석에 의 출력을 포함하십시오 . 이것은 R 환경을 요약 하고 오래된 패키지를 사용하고 있는지 쉽게 확인할 수 있도록합니다.

새로운 R 세션을 시작하고 스크립트를 붙여 넣어 실제로 재현 가능한 예제를 만들 었는지 확인할 수 있습니다.

모든 코드를 이메일에 넣기 전에 Gist github 에 넣는 것이 좋습니다. 코드에 멋진 구문 강조를 제공하고 이메일 시스템에 의해 망가지는 것에 대해 걱정할 필요가 없습니다.

307 RomanLuštrik May 11 2011 at 18:22

개인적으로 나는 "하나"의 라이너를 선호합니다. 라인을 따라 뭔가 :

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 shapefile)을 통해 일부 데이터 세트를 가져올 수 있습니다 (작업보기의 공간보기 참조).

library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")
281 RicardoSaporta May 14 2013 at 05:20

바로이 게시물에서 영감을 받아
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에서 작업하는 경우 출력이 자동으로 클립 보드에 복사되므로 실행 한 다음 질문에 붙여 넣을 수 있습니다.

소스는 여기에서 사용할 수 있습니다.

  • Github-pubR / reproduce.R

예:

# 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 질문 게시물을 더 쉽게 읽을 수 있고 복사 + 붙여 넣기도 더 쉬워집니다.


2013 년 10 월 업데이트 :

이제 텍스트 출력의 줄 수를 지정할 수 있습니다 (예 : StackOverflow에 붙여 넣을 내용). 이에 대한 lines.out=n인수를 사용하십시오 . 예:

reproduce(DF, cols=c(1:3, 17, 23), lines.out=7) 수율 :

    ==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(809L, 81L, 862L,747L, 224L, 721L, 310L, 53L, 853L, 642L),
      X2 = c(926L, 409L,825L, 702L, 803L, 63L, 319L, 941L, 598L, 830L),
      X16 = c(447L,164L, 8L, 775L, 471L, 196L, 30L, 420L, 47L, 327L),
      X22 = c(335L,164L, 503L, 407L, 662L, 139L, 111L, 721L, 340L, 178L)), .Names = c("id","X1",
      "X2", "X16", "X22"), class = "data.frame", row.names = c(1L,2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L))

    ==X==============================================================X==
198 SachaEpskamp May 11 2011 at 18:21

여기에 좋은 가이드가 있습니다.

가장 중요한 점은 다음과 같습니다 . 문제가 무엇인지 확인하기 위해 실행할 수있는 작은 코드를 만드십시오 . 이를위한 유용한 함수는 dput()이지만 매우 큰 데이터가있는 경우 작은 샘플 데이터 세트를 만들거나 처음 10 줄 정도만 사용하는 것이 좋습니다.

편집하다:

또한 문제가 자신의 위치를 ​​식별했는지 확인하십시오. 예제는 "On line 200 there is an error"가있는 전체 R 스크립트가 아니어야합니다. R (I love browser()) 및 Google 에서 디버깅 도구를 사용하면 문제가 어디에 있는지 실제로 식별하고 동일한 문제가 발생하는 사소한 예를 재현 할 수 있어야합니다.

167 RichieCotton May 11 2011 at 20:17

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'의 값으로 차원 이름이있는 'row', 'col'및 'value'라는 세 개의 열이있는 데이터 프레임으로 어떻게 변환 할 수 있습니까?

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

)

작은 단어 는 특히 중요합니다. 재현 가능한 최소한의 예를 목표로 해야합니다. 즉, 문제를 설명 할 수 있도록 데이터와 코드가 가능한 한 간단해야합니다.

편집 : 예쁜 코드는 못생긴 코드보다 읽기 쉽습니다. 스타일 가이드를 사용합니다 .

164 Paolo Jun 29 2012 at 15:32

R.2.14 (내 생각에)부터 데이터 텍스트 표현을 read.table다음과 같이 직접 공급할 수 있습니다 .

 df <- read.table(header=TRUE, 
  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
") 
146 BenBolker Jul 15 2011 at 02:49

아무리 노력해도 작은 데이터로 문제가 실제로 재현되지 않고 합성 데이터에서는 발생하지 않는 경우가 있습니다 ( 문제를 재현 하지 않은 합성 데이터 세트를 생성 한 방법을 보여주는 것이 유용하지만 일부 가설을 배제합니다).

  • 웹 어딘가에 데이터를 게시하고 URL을 제공해야 할 수 있습니다.
  • 데이터를 대중에게 공개 할 수 없지만 전혀 공유 할 수있는 경우 이해 관계자에게 전자 메일을 보내도록 제안 할 수 있습니다. 그 위에).
  • 데이터를 공개 할 수없는 사람들은 어떤 형태로든 공개하는 데 민감하기 때문에 실제로이 작업이 수행되는 것을 보지 못했습니다.하지만 어떤 경우에는 데이터가 충분히 익명화 / 스크램블 / 손상된 경우 여전히 데이터를 게시 할 수 있다는 것이 타당 해 보입니다. 어떤 식 으로든.

둘 중 하나를 수행 할 수 없다면 문제를 해결하기 위해 컨설턴트를 고용해야 할 것입니다.

편집 : 익명화 / 스크램블에 대한 두 가지 유용한 질문 :

  • 개인 데이터에서 예제 데이터 세트를 만드는 방법 (변수 이름 및 수준을 유익하지 않은 자리 표시 자로 대체)?
  • 연속적인 일 변량 분포에서 가져온 난수 집합이 주어지면 분포를 찾으십시오.
136 AriB.Friedman Jul 09 2012 at 22:41

지금까지의 답변은 재현성 부분에서 분명히 훌륭합니다. 이는 재현 가능한 예가 질문의 유일한 구성 요소가 될 수 없으며, 그럴 수도 없음을 명확히하기위한 것입니다. 지금까지 어떻게 시도했는지뿐만 아니라 원하는 모양과 문제의 윤곽을 설명하는 것을 잊지 마십시오. 코드만으로는 충분하지 않습니다. 당신은 또한 단어가 필요합니다.

다음은 피해야 할 일에 대한 재현 가능한 예입니다 (실제 예에서 가져온, 무고한 사람을 보호하기 위해 이름이 변경됨).


다음은 샘플 데이터와 제가 문제가있는 기능의 일부입니다.

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

이것을 어떻게 달성 할 수 있습니까?


124 jasmine_007 Feb 20 2014 at 16:11

위에서 언급하지 않은 R 예제를 만드는 매우 쉽고 효율적인 방법이 있습니다. 먼저 구조를 정의 할 수 있습니다. 예를 들면

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

>fix(mydata)

그런 다음 데이터를 수동으로 입력 할 수 있습니다. 이것은 큰 예제가 아닌 작은 예제에 효율적입니다.

119 JT85 Apr 10 2013 at 21:51

dput데이터 를 빠르게 생성하려면 데이터를 클립 보드에 복사 (일부)하고 R에서 다음을 실행할 수 있습니다.

Excel 데이터의 경우 :

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

txt 파일의 데이터 :

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

sep필요한 경우 후자에서 변경할 수 있습니다 . 물론 데이터가 클립 보드에있는 경우에만 작동합니다.

118 BrodieG Feb 12 2015 at 22:24

지침 :


질문 작성의 주요 목표는 독자가 시스템에서 문제를 최대한 쉽게 이해하고 재현 할 수 있도록하는 것입니다. 이렇게하려면 :

  1. 입력 데이터 제공
  2. 예상 출력 제공
  3. 문제를 간결하게 설명하십시오.
    • 20 줄 이상의 텍스트 + 코드가있는 경우 다시 돌아가 단순화 할 수 있습니다.
    • 문제 / 오류를 보존하면서 가능한 한 코드를 단순화하십시오.

이것은 약간의 작업이 필요하지만 다른 사람들에게 당신을 위해 일하도록 요청하기 때문에 공정한 절충안처럼 보입니다.

데이터 제공 :


내장 데이터 세트

지금까지 가장 좋은 옵션 은 내장 된 데이터 세트에 의존하는 것입니다. 이것은 다른 사람들이 당신의 문제에 대해 작업하는 것을 매우 쉽게 만듭니다. 입력 data()데이터가 사용 가능한 것이 무엇인지 알아보기 위해서는 프롬프트 R에. 몇 가지 고전적인 예 :

  • 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

A와 최후의 수단 , 당신이 사용할 수있는 dputR 코드 (예 :에 데이터 오브젝트를 변환 dput(myData)). 의 출력 dput이 종종 상당히 다루기 어렵고 복사-붙여 넣기가 성가 시며 나머지 질문을 모호하게 하기 때문에 "마지막 수단"이라고 말합니다 .

예상 출력 제공 :


누군가는 이렇게 말했습니다.

예상 출력 그림은 1000 단어의 가치가 있습니다.

-매우 현명한 사람

"이 결과를 예상했습니다"와 같은 내용을 추가 할 수있는 경우 :

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

당신의 질문에 사람들은 당신이하려는 일을 빨리 이해할 가능성이 훨씬 더 높습니다. 예상 결과가 크고 다루기 힘들다면 문제를 단순화하는 방법에 대해 충분히 생각하지 않았을 것입니다 (다음 참조).

문제를 간결하게 설명


가장 중요한 것은 질문하기 전에 가능한 한 문제를 단순화하는 것입니다. 내장 된 데이터 세트로 작업하기 위해 문제를 재구성하는 것은 이와 관련하여 많은 도움이 될 것입니다. 또한 단순화 과정을 거치는 것만으로도 자신의 문제에 대한 답을 찾을 수 있습니다.

다음은 좋은 질문의 몇 가지 예입니다.

  • 와 데이터 세트에 내장
  • 과 사용자 생성 데이터

두 경우 모두 사용자가 제공하는 간단한 예제로는 사용자의 문제가 거의 확실하지 않습니다. 오히려 그들은 문제의 본질을 추상화하고이를 간단한 데이터 세트에 적용하여 질문했습니다.

이 질문에 대한 또 다른 대답이 필요한 이유는 무엇입니까?


이 답변은 가장 좋은 방법이라고 생각하는 것에 초점을 맞추고 있습니다. 기본 제공 데이터 세트를 사용하고 결과적으로 최소한의 형태로 기대하는 것을 제공합니다. 가장 눈에 띄는 답변은 다른 측면에 중점을 둡니다. 나는이 대답이 눈에 띄게 떠오를 것이라고 기대하지 않습니다. 이것은 초보자 질문에 대한 의견으로 연결할 수 있도록 여기에 있습니다.

113 daniel Nov 27 2014 at 09:02

재현 가능한 코드는 도움을받는 데 중요합니다. 그러나 데이터 덩어리조차도 붙여 넣는 데 회의적인 사용자가 많습니다. 예를 들어, 민감한 데이터 또는 연구 논문에 사용하기 위해 수집 된 원본 데이터로 작업 할 수 있습니다. 어떤 이유로 든 데이터를 공개적으로 붙여 넣기 전에 데이터를 "변형"하는 편리한 기능이 있으면 좋겠다고 생각했습니다. anonymize패키지 의 기능 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
102 userJT Feb 22 2013 at 22:29

예를 들어 데이터가 필요한 경우가 많지만 정확한 데이터를 게시하고 싶지는 않습니다. 기존 라이브러리에있는 일부 기존 data.frame을 사용하려면 data 명령을 사용하여 가져옵니다.

예 :

data(mtcars)

그런 다음 문제를

names(mtcars)
your problem demostrated on the mtcars data set
92 TMS Jan 04 2014 at 02:07

를 사용하여 스크립트에 쉽게 넣을 수없는 대용량 데이터 세트가있는 경우 dput()데이터를 pastebin에 게시 하고 다음을 사용하여로드합니다 read.table.

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

@Henrik에서 영감을 얻었습니다 .

90 TylerRinker Jun 11 2015 at 20:57

재현 가능한 데이터를 빠르게 공유해야하는 이러한 요구를 해결 하기 위해 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
.. ...   ... ...    ...      ... ...    ...   ...
73 docendodiscimus Jan 09 2015 at 22:09

factor데이터에 재현 가능하게 만들 하나 이상의 변수 가있는 경우에는 dput(head(mydata))추가 droplevels를 고려하여 최소화 된 데이터 세트에없는 요인 수준이 dput출력에 포함되지 않도록하십시오. 예제를 최소화하십시오 .

dput(droplevels(head(mydata)))
66 CMichael Jan 09 2015 at 20:11

나는 http://old.r-fiddle.org/링크는 문제를 공유하는 매우 깔끔한 방법이 될 수 있습니다. 그것은 같은 고유 ID를 받고 그것을 SO에 삽입하는 것에 대해 생각할 수도 있습니다.

49 user2100721 Jul 22 2016 at 17:01

다음과 같이 콘솔 출력을 붙여 넣지 마십시오.

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

한 가지 더, 특정 패키지의 기능을 사용한 경우 해당 라이브러리를 언급하십시오.

34 andrii Aug 19 2017 at 02:02

reprex를 사용하여 이를 수행 할 수 있습니다 .

으로 mt1022는 지적 , "... 최소한의 재현 예를 생산하는 좋은 패키지입니다 "reprex " 에서 tidyverse ".

Tidyverse 에 따르면 :

"reprex"의 목표는 문제가있는 코드를 다른 사람들이 실행하고 고통을 느낄 수 있도록 패키지화하는 것입니다.

예는 tidyverse 웹 사이트에 있습니다.

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

재현 가능한 예제를 만드는 가장 간단한 방법 이라고 생각합니다 .

33 5revs,2users84%user5947301 Apr 20 2016 at 17:50

위의 모든 답변이 매우 흥미로 웠지만 여기에서 설명하는 것처럼 매우 쉬울 수도 있습니다.- R에 대한 도움을 얻기 위해 재현 가능한 최소 예제 를 만드는 방법

임의의 벡터를 만드는 방법은 여러 가지가 있습니다. R의 임의 값을 소수점 2 자리로 반올림 하거나 R의 임의 행렬로 100 개의 숫자 벡터를 만듭니다.

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))
28 TheRimalaya Apr 10 2016 at 01:15

내 제안 중 일부는 다음과 같습니다.

  • 기본 R 데이터 세트를 사용하십시오.
  • 자체 데이터 세트가있는 경우 dput다른 사용자가 더 쉽게 도움을 줄 수 있도록에 포함하세요.
  • 사용하지 마십시오 install.package()그냥 사용하는 경우 정말 필요한 경우가 아니면, 사람들이 이해 requirelibrary
  • 간결 해 지도록 노력하세요.

    • 데이터 셋을 가지고
    • 필요한 출력을 가능한 한 간단하게 설명하십시오.
    • 질문하기 전에 직접 해보십시오.
  • 이미지를 쉽게 업로드 할 수 있으므로 다음이있는 경우 플롯을 업로드하십시오.
  • 발생할 수있는 오류도 포함하세요.

이 모든 것은 재현 가능한 예의 일부입니다.

18 dank Apr 05 2017 at 04:08

testthat패키지의 함수를 사용하여 예상되는 결과를 표시하는 것이 좋습니다. 따라서 다른 사람들은 코드가 오류없이 실행될 때까지 코드를 변경할 수 있습니다. 이것은 당신의 텍스트 설명을 해독 할 필요가 없음을 의미하기 때문에 당신을 돕고 자하는 사람들의 부담을 덜어줍니다. 예를 들면

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

"내 생각에는 x가 10과 같거나 큰 y에 대해 1.23이되고 그렇지 않으면 3.21이 될 것이라고 생각하지만 결과는 얻지 못했습니다."보다 명확합니다. 이 어리석은 예에서도 코드가 단어보다 더 명확하다고 생각합니다. 를 사용 testthat하면 도우미가 코드에 집중할 수 있으므로 시간을 절약 할 수 있으며 게시하기 전에 문제를 해결했는지 알 수 있습니다.