HOWTO · R
R의 replicate() 함수
이 튜토리얼은 R에서 replicate() 함수의 사용을 소개합니다.
이 페이지의 내용
R의 replicate()는 표현식을 반복해서 평가하고 각 결과를 모읍니다. 같은 계산, 난수 추출 또는 시뮬레이션을 여러 번 실행해야 할 때 유용합니다. 모은 값이 벡터, 행렬, 배열 또는 목록 중 어떤 형태가 되는지는 표현식의 결과와 simplify 인수에 따라 달라집니다.
replicate()가 반복하는 것
첫 번째 인수인 n은 평가 횟수를 지정합니다. 두 번째 인수인 expr은 반복할 때마다 한 번씩 평가됩니다. 예를 들어 다음 코드는 스칼라 값 1을 다섯 개 반환합니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
result <- replicate(5, 1)
print(result)
반환된 벡터에는 각 평가에서 나온 값이 하나씩 들어 있습니다. expr에 난수 연산이 포함되어 있으면 평가할 때마다 다른 값이 나올 수 있습니다. replicate()는 결과를 모으지만, 서로 다른 값을 같게 만들지는 않습니다.
구문과 simplify 인수
일반적인 형식은 replicate(n, expr, simplify = "array")입니다. n은 반복 횟수이고, expr은 평가할 표현식이며, simplify는 R이 모은 결과를 어떤 방식으로 단순화할지 제어합니다. 기본값인 "array"를 사용하면 결과의 형태에 따라 값을 단순화할 수 있습니다. 스칼라 결과는 벡터가 될 수 있고, 길이가 같은 벡터 결과는 행렬이 될 수 있으며, 더 높은 차원의 결과는 배열이 될 수 있습니다. 각 반복의 결과를 별개의 객체로 유지하고 싶다면, 예를 들어 simplify = FALSE로 지정해 목록을 반환할 수 있습니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
values <- replicate(3, c("red", "blue"), simplify = FALSE)
print(typeof(values))
print(length(values))
[1] "list"
[1] 3
typeof()는 내부 자료형을 알려 주고, length()는 목록에 들어 있는 요소의 개수를 셉니다.
스칼라 또는 벡터 반복하기
스칼라 표현식은 반복할 때마다 결과를 하나씩 만듭니다. 표현식이 매번 길이가 같은 벡터를 반환하면 replicate()는 각 벡터를 행렬의 한 열에 넣습니다. 따라서 행은 벡터 안의 각 위치를, 열은 반복 횟수를 나타냅니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
result <- replicate(3, seq(1, 4))
print(result)
고정된 길이의 벡터를 반환하는 계산에도 같은 방식을 사용할 수 있습니다. 결과 길이가 매번 다르면 값을 규칙적인 행렬로 배열할 수 없습니다. 이때는 simplify = FALSE로 설정해 각 결과를 목록의 별도 요소로 보관하세요.
for() 루프와 함께 replicate() 사용하기
for() 루프를 사용해 각 반복의 결과가 될 값을 만들 수 있습니다. 표현식 안에서 벡터를 초기화하고 값을 채운 다음, 그 벡터를 표현식의 마지막 값으로 두세요.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
result <- replicate(2, {
values <- numeric(4)
for (i in seq_len(4)) {
values[i] <- i * 2
}
values
})
print(result)
마지막 표현식은 values이므로 각 평가에서 완성된 벡터가 반환되고, 단순화된 결과에는 반복마다 열이 하나씩 생깁니다. for() 루프 자체는 NULL을 반환합니다. 루프 안에서 값을 출력해도 그 출력값이 루프의 반환값이 되지는 않습니다. 반복할 표현식이 이런 루프만으로 이루어져 있으면 각 반복은 NULL을 반환합니다. 결과에 값을 포함하려면 값을 저장한 뒤 저장 객체를 반환하세요.
난수 시뮬레이션 반복하기
난수 표현식은 반복할 때마다 새로 평가됩니다. 예를 들어 rnorm(4)는 표준 정규분포에서 값 네 개를 추출합니다. 결과 행렬에는 네 값을 뽑은 결과마다 열이 하나씩 들어갑니다. 추출되는 수는 실행할 때마다 달라지므로 고정된 출력으로 간주하면 안 됩니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
set.seed(42)
draws <- replicate(3, rnorm(4))
print(dim(draws))
시뮬레이션 함수도 반복할 수 있습니다. 관심 있는 통계량이나 측정값을 반환하도록 함수를 정의한 다음, 그 함수 호출을 expr로 전달하세요. 예를 들어 runif(1)로 값 하나를 추출하는 함수를 여러 번 평가하면 시뮬레이션 값의 분포를 살펴볼 수 있습니다. 난수 시퀀스를 재현해야 한다면 시드를 정하고 기록하세요. 고정된 시드가 없으면 값은 대체로 실행할 때마다 달라집니다.
replicate()를 사용한 부트스트랩 재표집
부트스트랩 재표집은 관측된 데이터에서 복원추출한 표본을 뽑아 불확실성을 근사합니다. 각 반복에서 sample()이 재표집 데이터셋 하나를 만듭니다. 표본 크기가 원래 데이터와 같으면, 단순화된 결과는 부트스트랩 반복마다 열이 하나씩 있는 행렬이 됩니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
original_data <- c(2, 4, 6, 8, 10)
set.seed(42)
resamples <- replicate(5, sample(original_data, replace = TRUE))
print(dim(resamples))
각 열은 재표집 데이터셋 하나를 나타냅니다. 복원추출이므로 같은 값이 두 번 이상 나타날 수 있습니다. 표본의 모든 값을 보관하는 대신 통계량을 부트스트랩하려면, 반복 표현식 안에서 mean(sample(original_data, replace = TRUE))처럼 통계량을 계산하세요. 그러면 반복마다 통계량 하나가 나오며, 일반적으로 벡터에 모입니다.