으앙망!

으앙 망했어!

공부/R

[R] An introduction to R: 2.1-2.3

euangmang 2024. 11. 26. 23:04

R의 공식 문서 중 하나인 'An introduction to R'을 하나씩 따라해볼까 싶다.

대충 학교 수업에서 얻은 지식과 약간의 구글링을 통해 얻은 방법들로

약간의 손구락질은 가능하게 되었지만

근본적으로 효율성을 높이고자 한다면 이 R이라는 언어가

어떻게 구성되어 있는지 알아 볼 필요가 있을 것 같았다.

그래서 공식 문서, 그 중에서도 입문서를 열어 보았다.

 

R-intro.pdf
0.59MB

 

공식 문서는 R 홈페이지에서 얻을 수 있다.

위의 PDF 파일은 R 버전 4.4.2를 위한 문서이며,

나는 이 파일을 기준으로 연습을 해보고자 한다.

물론 문서에 있는 내용을 다 적을 것은 아니고,

그 중에서 좀 필요할 것 같은 내용만 축약해서 정리할 생각이다.

 

본 글에서는 2.1-2.3의 내용을 정리해보았다.

각 소주제는 다음과 같다.

  • 2.1: Vectors and assignment
  • 2.2: Vector arithmetic
  • 2.3: Generating regular sequences

 

vector는 순서가 있는 여러 숫자들의 집합이다.

vector를 생성하는 대표적인 방법은 함수 사용하는 것이다.

: c(원소1, 원소2, ...) )

 

변수를 생성하는 대표적인 세 가지 방법은 다음과 같다.

  1. ‘<-‘ 사용
  2. ‘=’ 사용
  3. assign 함수 사용

특히 assign 함수는 특정 조건에서 유용할 것이다.

(예: 함수명을 문자열을 이용해 선언해야 할 경우)

 

v1 <- c(1, 3, 2)
v2 =  c(1, 3, 2)
assign("v3", c(1, 3, 2))

출처: 나

v1, v2, v3는 동일하게 1, 3, 2라는 값을 가진 변수가 된다.

 

c 함수에 여러 vector를 넣으면 하나의 vector로 묶인다.

concatenate 되는 듯하다.

 

v1 <- c(1, 2, 3, 4)
v2 <- c(6, 3, 1)
v3 <- c(v1, 0, v2)
print(v3)
[1] 1 2 3 4 0 6 3 1

 

v1에는 1, 2, 3, 4가 들어있고,

v2에는 6, 3, 1이 들어있다.

c 함수에 다시 vector를 넣어주면 그 vector들이 순서대로 엮여

하나의 vector를 생성한 것이다.


 

range 함수 vector를 넣으면

vector에 들어있는 값들 중 최댓값과 최솟값으로 구성된 길이 2 vector를 생성한다.

 

v1 <- c(10, 7, 4)
v2 <- c(90, 5, 3)
v1rng <- range(v1)
v2rng <- range(v2)
print(v1rng)
print(v2rng)
[1]  4 10
[1]  3 90

 

v1의 최솟값은 4, 최댓값은 10이기 때문에 v1rng 변수에는 410이 들어있는 것이고,

v2과 v2rng 역시 동일한 원리가 적용되었다.


 

vector에 대한 사칙연산은 물론 가능하며,

mean, var, sd와 같은 기본적인 통계값 계산도 쉽게 된다.

특히 var 함수로는 분산을 구할 수 있는데,

이때 분모는 자유도가 1 줄어든 것으로 계산이 이루어진다고 명시되어 있다.

(var 안에 matrix를 넣으면 공분산이 구해진다고 하는데, 어떤 원리로 되는 건지 모르겠다.)


sort 함수를 사용하면 동일한 길이의 vector가 나오는데,

기본적으로 원소가 오름차순으로 정렬된다.

(그 외에도 order sort.list 등 다양한 함수가 있다고 하더라.)

 

v1 <- c(4, 2, 8, 3, 5)
v1srt  <- sort(v1)
v1srt2 <- sort(v1, decreasing=TRUE)
print(v1srt)
print(v1srt2)
[1] 2 3 4 5 8
[1] 8 5 4 3 2

 

물론 sort 함수의 인수 중 decreasing 값을 TRUE로 설정해준다면

내림차순으로 정렬하는 것도 가능하다.


 

복소수를 계산할 때에는 조금 유의해야 할 것이 있다.

특히 음수에 대해 제곱근을 씌울 때,

예를 들어 sqrt(-10)을 하면 warning과 함께 NaN이 나오는데,

sqrt(-10 + 0i)를 입력하면 복소수로 계산이 이루어진다.

 

c1 <- sqrt(-12)
c2 <- sqrt(-12 + 0i)
print(c1)
print(c2)
[1] NaN
[1] 0+3.464102i

 

실제로 제곱근 12는 약 3.4641이다.

알다시피 제곱근에 음수값은 실수 영역에서 존재할 수 없지만,

허수 영역으로 확장을 한다면 복소수로서 존재할 수 있다.

그 경우 위의 경우처럼 허수부를 명시해줌으로써

복소수 계산을 정상적으로 수행할 수 있다.


 

연속된 값으로 구성된 vector를 생성할 때는 c 함수 말고도 여러가지 방법이 있다.

 

1. 콜론(:)을 이용하면 간단히 생성이 가능하다.

예를 들어, 1:30 c(1, 2, ..., 30)과 동일하다.

v1 <- 1:10
v2 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(v1)
print(v2)
[1]  1  2  3  4  5  6  7  8  9 10
[1]  1  2  3  4  5  6  7  8  9 10

 

2. 콜론(:)은 여러 연산들 사이에서 가장 선순위이기 때문에

3*2:10을 하면 3*c(2, 3, ..., 10)과 동일하다.

그렇기 때문에 1:n-1 1:(n-1)은 엄연히 다르니 주의가 필요하다.

 

v1 <- 2*1:5-1
v2 <- 2*1:(5-1)
print(v1)
print(v2)
[1] 1 3 5 7 9
[1] 2 4 6 8

 

3. 반대로 30:1을 이용하면 역순으로 vector의 생성이 가능하다.

 

4. seq 함수가 좀 더 보편적인 방법이라 한다.

총 다섯 개의 인수가 있다는데, 인수명을 명시하지 않는다면 자동으로 처음 두 개가 시작값과 끝값이다.

인수를 모두 보자면 from, to, by, length, along이 있는데,

이 중 along은 이미 존재하던 vector를 넣음으로써

동일한 길이의 vector를 생성하도록 해주는 인수이다.

결국 기존의 vector로부터 길이를 가져와 length에 넣어주는 역할을 하게 되는 것이다.

 

v1 <- seq(1, 10)
v2 <- seq(from=1, to=10)
v3 <- seq(to=10, from=1)
v4 <- seq(from=1, to=10, by=3)
v5 <- seq(from=1, to=10, length=3)
v6 <- seq(from=1, to=10, along=v5)

출처: 나

위 결과를 보면 알 수 있겠지만,

인수 by는 처음(from)부터 3씩 증분하여 vector를 생성,

인수 length는 처음과 끝(to)을 포함하여 총 길이 3인 vector를 생성하도록 한다.

 

5. rep 함수를 사용하면 인수로 주어진 값 혹은 vector를 복제하여 새로운 vector를 생성하는데,

이때 times each 중 하나의 인수를 사용해 복제 방식을 선택할 수 있다.

단일 값에 대해서는 상관 없지만, vector가 주어진 상황에서는

times=3이라면 vector처음부터 끝까지 세 번 반복된 새로운 vector가 생성되는 것이고,

each=3이라면 vector각 원소가 세 번씩 순서대로 반복된 새로운 vector가 생성되는 것이다.

v1 <- rep(1, 10)
v2 <- rep(1:3, 3)
v3 <- rep(1:3, times=3)
v4 <- rep(1:3, each=3)

출처: 나

timeseach라는 인수가 꽤 헷갈릴 것 같은데,

이건 자주 써보는 게 좋을 것 같다.

아무래도 rep 함수는 종종 쓰게 될 것 같다.


 

확실히 word로 작성할 때보다 조금은 더 신경이 쓰이는 감이 없지않아 있다.

왜지... 누가 여기 와서 읽어볼 것도 아닌데...

'공부 > R' 카테고리의 다른 글

[R] R, R studio 설치 (MacBook Pro, M1)  (3) 2024.11.21