R에서 벡터는 여러번 다루었다. 하지만, 벡터(vector)를 모르고서는 R을 이야기 할 수 없다. 데이터 타입이 어떠한지 알아야, 그래프를 그리든, 모델 분석을 하든 어떻게 든 할 수 있다.
R vector |
벡터의 기초지식
벡터란 다양한 값을 요소로 하는 오브젝트 이다. 다른 프로그램 영역에서는 '배열'에 해당 한다고 생각해도 좋을 것이다. 벡터에 있어서는 첨자를 유연하게 지정 할 수 있고 효율적으로 요소를 추출 할 수 있다. 또 벡터에 들어 있는 요수의 수가 1개뿐인 벡터를 특별히 '스칼라'라고 하기도 한다.
예를 들면 아래 실행 예에서 5개의 정수를 요소로 하는 벡터를 초기화하고 있다. 벡터로 부터의 값 추출에는 '배열'을 사용한다. 또 R '배열'은 '1'로 부터 시작 한다. 이와 반대로 파이썬은 배열을 '0' 으로 시작 한다.
배열은 '[]' 안에 번호(이름이 붙어 있으면 이름도 가능)을 지정 한다. 예를 들면 'x[1]는 'x'라는 첫번째 요소만 꺼낸다 ' x[3:5]'는 'x'라는 벡터의 3번째 부터 5번째 가지의 3개의 요소를 꺼낸다.
벡터로부터 여기저기서 요소를 추출하는 경우는 'c' 함수의 배열을 지정해서 추출한다. 벡터로 부터 일부 요소를 제외 하고 추출 하는 것도 가능 하다. 그 경우에는 '-' (마이너스)를 사용한다.
아래 예제는 벡터에 대한 기초적인 사용 방식이다.
x <- c(1, 3, 5, 7, 9)
# 2번째 요소
x[2]
## [1] 3
# 3번째 요소부터 5번째 요소
x[3:5]
## [1] 5 7 9
# 3번째와 5번째 요소
x[c(3,5)]
## [1] 5 9
# 2째와 4번째를 제외하고 추출
x[-c(2,4)]
## [1] 1 5 9
🚚 다른 데이터 형식 오브젝트를 벡터로 정리 한다.
또 다른 데이터 형식 오브젝트 1개의 벡터로 통합하려면 그중에서 가장 '표현력이 풍부한 형태'로 강제 변환 된다. 아래 표에서 위에 위치하는 데이터 형식 만큼 표현력이 풍부 하다.
# 이하는 'double'이 가장 표현력이 풍부
(z1 <- c(1.1, 1, TRUE))
## [1] 1.1 1.0 1.0
typeof(z1)
## [1] "double"
# 이하는 'complex'가 가장 표현력이 풍부
(z2 <- c(1+1i, 1.1, 1, TRUE))
## [1] 1.0+1i 1.1+0i 1.0+0i 1.0+0i
typeof(z2)
## [1] "complex"
# character가 가장 표현력이 풍부
(z3 <- c("i", 1+1i, 1.1, 1))
## [1] "i" "1+1i" "1.1" "1"
typeof(z3)
## [1] "character"
🚚 벡터 요소에 이름을 붙인다. 벡터에는 요소마다 이름을 붙일 수 있다. 그 경우는 'names' 함수를 사용한다. 이름은 "배열"로 사용할 수 있다.
x <- c(1, 3, 5, 7, 9)
# 벡터의 요소에는 이름을 붙일 수 있다.
names(x) <- c("A", "B", "C", "D", "E")
x
## A B C D E
## 1 3 5 7 9
# 이름을 배열로 사용할 수 있다.
x[c("A", "C")]
## A C
## 1 5
x <- c(1, 3, 5, 7, 9)
# 벡터의 요소에는 이름을 붙일 수 있다.
names(x) <- c("A", "B", "C", "D", "E")
x
## A B C D E
## 1 3 5 7 9
# 이름을 배열로 사용할 수 있다.
x[c("A", "C")]
## A C
## 1 5
🚚 벡터의 이용
벡터의 강력한 기능 중 하나가 반복 처리를 생략 할 수 있다는 점이다. 예를 들면 1부터 10 까지의 정수를 요소로 하는 벡터가 있다고 하자. 이 합을 구하는 경우 많은 프로그래밍 언어에서는 요소를 하나씩 추출 해서 더해야 하지만 R에서는 'sum' 함수를 사용해서 한 번에 계산 할 수 있다.
#클론을 사용하면 연속한 정수를 초기화 할 수 있다.
x <- 1:10
# 가 요소에 1을 더한다.
x + 1
## [1] 2 3 4 5 6 7 8 9 10 11
# 한꺼번에 합계 계산
sum(x)
## [1] 55
다음으로 논리 연산자인 '>'를 사용한 식에서 각 요소가 5보다 큰지 여부를 판정해 본다. 여기에서 다른 많은 프로그램 언어와는 달리 벡터로 부터 요소를 일일이 꺼내서 개별적으로 비교하는 것을 반복할 필요 없이 한 번에 모든 요소를 비교 할 수 있다는 점에 주목한다.
게다가 이 연산식을 그대로 첨자로 사용하여 5보다 큰 요소를 한 번에 정리해서 추출 할 수 있다.
x <- 1:10
# 5보다 큰가
x > 5
## [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
# 5보다 큰 요소를 추출
x[x>5]
## [1] 6 7 8 9 10
🚚 벡터를 초기화 한다.
벡터를 초기화는 매우 중요하다. 빈 데이터 프레임을 만든 다음에, for 루프문을 돌려서 데이터를 채워 나간다. 그때, 벡터에서 데이터 유형을 초기화 하면 매우 좋다.
# 빈 수 오브젝트를 준비한다.
# 이하는 4분류의 기본 오브젝트를 작성
(xNum <- numeric())
## numeric(0)
(xint <- integer())
## integer(0)
(xDou <- double())
## numeric(0)
(xCom <- complex())
## complex(0)
# 각 유형을 확인 하다.
typeof(xNum)
## [1] "double"
typeof(xint)
## [1] "integer"
typeof(xDou)
## [1] "double"
typeof(xCom)
## [1] "complex"
# 5개의 0을 요소로 하는 벡터 작성
(x <0- integer(5))
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 복소수의 경우
# 1 + i이면 i 가 다른 오브젝트로 취급한다.
(x <- 1+1i)
## [1] 1+1i
# 복수의 값을 한꺼번에 하나의 오브젝트에 대입
(y <- 1:10)
## [1] 1 2 3 4 5 6 7 8 9 10
반복 함수 (seq, rep) 벡터
반복 함수와 랜덤 벡터를 잘 사용하게 되면, for 루프문을 쓰지 않고 빠르게 계산 할 수 있는 방법이 매우 많다.
🚚 반복 함수 seq 벡터를 작성 한다.
아래에는 규칙성 있는 수열을 작성 한다.
# 1부터 5까지 자연수 수열을 오브젝트 x에 작성
(x <- 1:5)
## [1] 1 2 3 4 5
# 'seq' 함수를 사용한 수열 작성
(x <- seq(from = 1, to =5, by =1))
## [1] 1 2 3 4 5
# 인수 이름은 생략 가능
(x <- seq(1,5,1))
## [1] 1 2 3 4 5
# 인수가 하나일 때는 마지막 항으로 간주된다.
(x <- seq(5))
## [1] 1 2 3 4 5
# 'along.with' 인수에 지정된 요소와 개수가 일치하는 수열을 반환 한다.
(x <- seq(10,20, along.with = 1:5))
## [1] 10.0 12.5 15.0 17.5 20.0
# 두 개의 간격을 둔 수열
(x <- seq(1, 10, by =2))
## [1] 1 3 5 7 9
# 공차를 마이너스 지정
(x <- seq(1, -10, -2))
## [1] 1 -1 -3 -5 -7 -9
# 정수 외에도 적용 할 수 있다.
(y <- seq(0, 1, 0.2))
## [1] 0.0 0.2 0.4 0.6 0.8 1.0
수가 일정한 규칙으로 연속하는 벡터를 작성 하려면 오브젝트 작성 시 ':'으로 초항과 종항을 지정하거나 ' seq' 함수를 사용한다.
'<-'를 사용해서 오브젝트를 작성 할때 우변에 '1:5'처럼 지정하면 좌변 오브젝트 '1' 부터 '5' 까지 정수 수열이 작성 된다.
🚚 요소를 반복할 수열 req 벡터를 작성 한다.
요소를 반복한 수열을 작성 하는 방법을 설명 한다.
# 오브젝트의 내용을 반복한다.
x <- c(1, 3, 7)
rep(x, 3)
## [1] 1 3 7 1 3 7 1 3 7
# 같지만 R 내부에서의 처리가 효율적
rep.int(x, 3)
## [1] 1 3 7 1 3 7 1 3 7
# 전체의
rep(x, length =10)
## [1] 1 3 7 1 3 7 1 3 7 1
지정된 수를 반복한 벡터를 'rep' 함수로 작성 할 수 있다. 'rep' 함수에는 실행 예에서 사용한 것 외에도 인수를 지정 할 수 있다. 그 중 중요한 인수가 'times'과 'each', 'length.out'이다.
'times' 인수는 제 1인수 오브젝트 'x' 전체를 반복하는 횟수를 지정하고, 'each' 인수는 'x'의 각 요소의 반복 횟수를 지정 한다. 'length.out' 인수는 출력 벡터의 길이를 지정 한다.
rep(1:3, each = 3)
## [1] 1 1 1 2 2 2 3 3 3
rep(1:3, times = 3)
## [1] 1 2 3 1 2 3 1 2 3
rep(1:3, length.out = 10, each = 3)
## [1] 1 1 1 2 2 2 3 3 3 1
# 1을 5번 ,10을 1번. 후반 인수 c(5.1)가 반복 횟수 지정
rep(c(1,10), c(5,1))
## [1] 1 1 1 1 1 10
위의 내용을 잘 알면 R에서 코드를 아주 간단 하게 짤 수 있다.
※ 참고서적 : 빅데이터 통계분석을 위한 R 프로그래밍 레퍼런스북 R (교학사)
댓글 없음:
댓글 쓰기