sample( )의 한 가지 흥미로운 적용 방법은 데이터를 무작위로 섞는 데 사용하는 것이다. 예를 들어, 다음과 같이 1부터 10까지의 숫자에서 10개의 샘플을 뽑으면 1부터 10까지의 숫자를 무작위로 섞는 것이 된다.
> sample(1:10, 10)
[1] 1 2 7 4 8 3 6 10 5 9
이를 사용하면 iris 데이터 역시 무작위로 섞을 수 있다. 다음 코드에서 NROW( )는 주어진 데이터 프레임 또는 벡터의 행의 수 또는 길이를 반환하는 함수다.
> iris[sample(NROW(iris), NROW(iris)),]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
121 6.9 3.2 5.7 2.3 virginica
99 5.1 2.5 3.0 1.1 versicolor
...
샘플링은 주어진 데이터를 훈련 데이터Training Data와 테스트 데이터로 분리하는 데 유용하게 사용할 수 있다. 훈련 데이터로부터 모델을 만든 뒤 테스트 데이터Test Data에 모델을 적용하면 모델의 정확성을 평가할 수 있다.
모델의 정확성을 잘 평가하려면 데이터에서 예측 대상이 되는 값별로 샘플을 균일하게 뽑을 필요가 있다. 예를 들어, 아이리스의 Sepal.Width, Sepal.Length, Petal.Width, Petal.Length로부터 Species를 예측하는 모델을 만드는 경우를 생각해보자. 만약 훈련 데이터에는 setosa만 들어 있고 테스트 데이터에는 vericolor와 virginica만 들어 있다면 제대로 된 모델링과 모델의 평가가 이루어질 수 없다. 평가를 올바르게 하려면 훈련 데이터와 테스트 데이터에 Species 값별로 데이터의 수가 균일한 것이 좋다. 바로 이런 경우에 sampleBy( )가 유용하다.
다음은 아이리스 데이터에서 각 Species별로 10%의 데이터를 추출한 예다. sampleBy( )에서 Species를 지정했으므로 각 종별로 5개씩 데이터가 정확히 샘플로 추출된 것을 볼 수 있다.
> sampleBy(~ Species, frac=0.1, data=iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
setosa.11 5.4 3.7 1.5 0.2 setosa
setosa.29 5.2 3.4 1.4 0.2 setosa
setosa.39 4.4 3.0 1.3 0.2 setosa
setosa.41 5.0 3.5 1.3 0.3 setosa
setosa.46 4.8 3.0 1.4 0.3 setosa
versicolor.55 6.5 2.8 4.6 1.5 versicolor
versicolor.74 6.1 2.8 4.7 1.2 versicolor
versicolor.82 5.5 2.4 3.7 1.0 versicolor
versicolor.90 5.5 2.5 4.0 1.3 versicolor
versicolor.100 5.7 2.8 4.1 1.3 versicolor
virginica.112 6.4 2.7 5.3 1.9 virginica
virginica.122 5.6 2.8 4.9 2.0 virginica
virginica.123 7.7 2.8 6.7 2.0 virginica
virginica.135 6.1 2.6 5.6 1.4 virginica
virginica.140 6.9 3.1 5.4 2.1 virginica