Chapter 1 Numbers

R에서 숫자 형태는 크게 integer와 double로 나눌 수 있습니다. 이 중 integer는 정수를 의미하며, double은 부동소수점 실수를 의미합니다.

1.1 integer와 double의 vector 만들기

먼저 double 형태의 벡터를 만듭니다.

dbl_var = c(1, 2.5, 4.5)
dbl_var
## [1] 1.0 2.5 4.5

숫자 뒤에 L을 붙이면 integer(정수) 형태로 입력됩니다.

int_var = c(1L, 6L, 10L)
int_var
## [1]  1  6 10

1.1.1 둘 간의 형태 바꾸기

as.*() 함수를 이용해 각 데이터의 형태(Type)을 바꿀 수 있습니다.

as.double(int_var)
## [1]  1  6 10
# as.numeric(int_var)

as.double() 함수를 통해 integer 형태를 double 형태로 바꿀 수 있습니다. as.numeric() 함수는 as.double()과 동일한 역할을 합니다.

as.integer(dbl_var)
## [1] 1 2 4

as.integer() 함수를 통해 double 형태를 integer 형태로 바꿀 수 있습니다. 소수점이 사라지고 정수형태로 바뀌었습니다.

1.2 비임의(Non-random) 숫자 생성하기

콜론(:)과 c() 함수를 통해 순서가 있는 숫자 벡터를 생성할 수 있습니다.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10

콜론을 통해 1에서 10까지 숫자가 생성됩니다.

c(1, 5, 10)
## [1]  1  5 10

c() 함수 내부에 입력한 숫자로 벡터가 생성됩니다.

1.2.1 seq() 함수 이용

seq() 함수를 이용할 경우 더욱 다양하게 숫자 벡터를 생성할 수 있습니다.

seq(from = 1, to = 21, by = 2)
##  [1]  1  3  5  7  9 11 13 15 17 19 21

from에는 시작 숫자, to에는 종료 숫자, by에는 간격을 입력합니다. 즉 1에서 21까지 2 단위로 숫자가 생성됩니다.

seq(0, 21, length.out = 15)
##  [1]  0.0  1.5  3.0  4.5  6.0  7.5  9.0 10.5 12.0 13.5 15.0 16.5 18.0 19.5 21.0

인자에 length.out을 쓸 경우 from에서 to까지 동일한 증가폭으로 15개의 숫자를 생성합니다.

rep(1: 4)
## [1] 1 2 3 4

rep() 함수 역시 seq() 함수와 비슷한 역할을 합니다.

rep(1:4, times = 2)
## [1] 1 2 3 4 1 2 3 4

times 인자를 추가해줄 경우, 해당 숫자만큼 반복되어 벡터가 생성됩니다.

rep(1:4, each = 2)
## [1] 1 1 2 2 3 3 4 4

each 인자를 추가할 경우, 각 숫자를 n번 반복하여 벡터가 생성됩니다.

1.3 임의(Random) 숫자 생성하기

이번에는 임의의 숫자를 생성하는 방법에 대해 알아보겠습니다.

1.3.1 Uniform Numbers

균등 분포(Uniform distribution)에서 임의의 숫자를 생성하기 위해서는 runif() 함수를 사용합니다.

runif(5)
## [1] 0.2876 0.7883 0.4090 0.8830 0.9405

기본적으로 runif() 함수는 0과 1사이에서 임의의 숫자를 생성하며, 괄호 안에 입력된 숫자만큼의 갯수의 난수를 생성합니다.

runif(5, min = 0, max = 25)
## [1]  1.139 13.203 22.310 13.786 11.415

min과 max인자를 추가할 경우 해당 값 사이에서 난수를 생성합니다.

sample() 함수 역시 Uniform Number를 생성할 수 있습니다.

sample(0:25, 10, replace = TRUE)
##  [1] 19 13 21 24 25  4 18 24 24  8

0에서 25까지 숫자중에서 10개의 숫자를 선택하며, replace를 TRUE로 할 경우 복원추출, FALSE로 할 경우 비복원추출을 시행합니다.

1.3.2 Non-Uniform Numbers

비균등 확률 분포에서 난수를 생성하기 위해서는 크게 4가지 함수가 있습니다.

  • r*: 난수 생성
  • d*: 밀도(Density) 혹은 확률 질량 함수(Probability mass function)
  • p*: 누적 분포(Cumulative distribution)
  • q*: 분위수(Quantile)

1.3.2.1 정규 분포(Normal Distribution)

R에서 정규 분포 관련 함수는 *norm() 입니다.

rnorm(10, mean = 0, sd = 1)
##  [1]  0.4008  0.1107 -0.5558  1.7869  0.4979 -1.9666  0.7014 -0.4728 -1.0678
## [10] -0.2180

rnorm() 함수를 이용하여 평균이 0, 표준편차가 1인 정규분포 함수에서 난수 10개를 생성합니다.

dnorm(0, mean = 0, sd = 1)
## [1] 0.3989

d = 0인 지점의 밀도를 계산합니다.

pnorm(0, mean = 0, sd = 1)
## [1] 0.5

d = 0인 지점의 누적 분포를 구합니다.

qnorm(0.5, mean = 0, sd = 1)
## [1] 0

누적 분포가 0.5인 지점의 분위수를 구합니다.

1.3.2.2 기타 분포

정규 분포 외에도 여러 분포에서 난수를 생성할 수 있습니다. 각 함수별 인자는 help()를 통해 확인할 수 있습니다.

  • 이항 분포: rbinom, dbinom, pbinom, qbinom
  • 푸아송 분포: rpois, dpois, ppois, qpois
  • 지수 분포: rexp, dexp, pexp, qexp
  • 감마 분포: rgamma, dgamma, pgamma, qgamma

1.4 반올림

숫자의 올림, 내림, 반올림 등을 실행합니다. 먼저 다음과 같이 숫자를 입력합니다.

x = c(1, 1.35, 1.7, 2.05, 2.4, 2.75, 3.1, 3.45, 3.8, 4.15, 
      4.5, 4.85, 5.2, 5.55, 5.9)
round(x)
##  [1] 1 1 2 2 2 3 3 3 4 4 4 5 5 6 6

round() 함수는 가장 가까운 정수로 반올림을 합니다.

round(x, digits = 2)
##  [1] 1.00 1.35 1.70 2.05 2.40 2.75 3.10 3.45 3.80 4.15 4.50 4.85 5.20 5.55 5.90

함수 내부에 digits 인자를 추가해 줄 경우, 해당 자리수 만큼 반올림을 합니다.

ceiling(x)
##  [1] 1 2 2 3 3 3 4 4 4 5 5 5 6 6 6

ceiling() 함수는 올림을 실행합니다.

floor(x)
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5

floor() 함수는 내림을 실행합니다.