벡터(Vector) - 2부
이전 포스트에선 벡터에 대한 기초적인 개념과 벡터를 Slicing하는 법을 알아보았다.
(Slicing은 Index를 이용하여 내가 원하는 원소만 가지고 오는 것을 말한다.)
이번엔 벡터의 연산과 연속하는 벡터를 만드는 법에 대해 알아보자.
벡터의 연산
- 벡터는 원소 하나하나에 접근하여 각 원소마다 연산을 수행하거나, 벡터 전체를 일괄적으로 연산할 수 있고, 벡터를 집합으로 취급하여 집합 연산(합집합, 교집합, 차집합)을 할 수도 있다.
- 벡터의 연산결과는 벡터이다.
- 벡터와 벡터의 연산은 같은 위치의 원소끼리 연산된다.
# 자릿수가 맞는 벡터의 연산
x <- c(1,2,3,4,5)
y <- c(5,4,3,2,1)
x+y
## [1] 6 6 6 6 6
- 자릿수가 맞지 않는 벡터를 연산하는 경우, 경고가 뜨면서 자릿수가 적은 벡터에 대하여 그 앞부분을 뒤에 추가해 벡터의 자릿수를 맞춰서 연산한다.
# 자릿수가 맞지 않는 벡터의 연산
x <- c(1,2,3,4,5)
y <- c(3,2,1)
x+y
## Warning in x + y: 두 객체의 길이가 서로 배수관계에 있지 않습니다
## [1] 4 4 4 7 7
- ==, != 연산자를 사용해 두 벡터에 저장된 값들을 한 번에 비교할 수 있다. 그러나 if문과 같은 조건문에서는 단 하나의 참 또는 거짓 값을 사용하므로, ==, !=가 아닌 indentical()을 사용해야한다.
- identical()
: 객체가 동일한지 판단한다.
# identical을 써서 두 벡터의 동일 여부를 따져보자.
x <- c(1,2,3,4,5)
y <- c(1,2,3,4,5)
identical(x, y)
## [1] TRUE
x1 <- c(5,4,3,2,1)
y1 <- c(1,2,3,4,5)
identical(x1, y1)
## [1] FALSE
- 벡터를 집합(Set)으로 취급하여 집합 간 합집합, 교집합, 차집합을 계산해보자.
# 대상이 될 집합
A = c(1,2,3,4,5,6)
B = c(1,3,5,7,8)
- union()
: 합집합을 구한다.
union(A, B)
## [1] 1 2 3 4 5 6 7 8
- intersect()
: 교집합을 구한다.
intersect(A, B)
## [1] 1 3 5
- setdiff()
: 차집합을 구한다.
setdiff(A, B)
## [1] 2 4 6
- setequal()
: 동일한 집합인지 판단한다.
setequal(A, B)
## [1] FALSE
※ identical()와 setequal()의 차이
# identical과 setequal의 차이
A = c(1,2,3,4,5)
B = c(5,4,3,2,1)
identical(A, B)
## [1] FALSE
setequal(A, B)
## [1] TRUE
- identical()은 두 벡터의 원소가 동일할지라도 순서가 다른 경우 동일한 벡터로 인식하지 않는다.
- setequal()은 벡터를 집합으로 보며, 집합에게 있어서 순서는 중요한 것이 아니며, 단순히 원소의 존재만을 신경쓰므로, 동일한 집합으로 인식한다.
- Vector %in% element
: Vector에 element가 있는지 파악한다. - 자주 쓰이는 코드 중 하나로, 꼭 기억해놓도록 하자!
# Vector %in% element
vt1 <- c("apple", "grape", "melon", "apple")
vt1 %in% "apple"
## [1] TRUE FALSE FALSE TRUE
sum(vt1 %in% "apple")
## [1] 2
※ sum()을 이용해 TRUE의 갯수를 세면, apple이 벡터 내에 몇 개 있는지 알 수 있다.
vt1 %in% "pineapple"
## [1] FALSE FALSE FALSE FALSE
sum(vt1 %in% "pineapple")
## [1] 0
- Boolean의 성격인 TRUE == 1, FALSE == 0을 이용하여, 특정 문자가 있는지 여부와 그 문자가 몇 개나 있는지를 확인해 보았다.
연속하는 벡터
: 벡터는 매우 많이 사용하는 데이터 타입이며, 특정 패턴으로 연속하는 벡터를 만들 일은 생각보다 자주 있다.
이번엔 패턴을 가지고 연속하는 벡터를 만들어보도록 하자.
- from:to 를 써보자.
: from부터 to까지의 숫자에 대한 벡터를 반환함(from과 to포함)
# from:to
3:7
## [1] 3 4 5 6 7
c(3:7)
## [1] 3 4 5 6 7
3:-3
## [1] 3 2 1 0 -1 -2 -3
※ 위처럼 값을 증가 시키는 것뿐 아니라 감소시키는 것도 가능하다.
- seq()
: 연속한 값을 생성한다. - 주요 Parameter
: seq(from: 시작 값, to: 끝 값, by: 증가치, length: 벡터의 길이, length.out: 연속된 값의 생성 개수)
※ 함수에 마우스 커서 혹은 드래그를 하고 F1을 누르면 해당 함수에 대한 상세한 설명을 볼 수 있다.
# seq 함수를 써보자.
seq(from = 1, to = 10, by = 2)
## [1] 1 3 5 7 9
seq(1,10,2)
## [1] 1 3 5 7 9
※ R을 비롯한 다양한 언어들에서 Parameter의 이름(from, to, by와 같은 것)을 쓰지 않더라도, Parameter와 동일한 순서로 Parameter를 입력하면, 동일한 결과가 도출 된다.
# 1부터 10까지를 7등분한 벡터
seq(1,10,length = 7)
## [1] 1.0 2.5 4.0 5.5 7.0 8.5 10.0
# 1부터 3씩 증가하는 길이 7의 벡터
seq(from = 1, by = 3, length.out = 7)
## [1] 1 4 7 10 13 16 19
- seq_along():
주어진 객체의 길이만큼 연속한 값을 생성한다.
(여기서 길이는 length()의 의미와 동일하다. 숫자가 아닌 Vector를 넣어보자!)
# seq_along을 써보자
seq_along(5)
## [1] 1
seq_along(c("apple", "banana", "melon"))
## [1] 1 2 3
※ 벡터의 길이만큼 연속한 값이 생성되므로, ID와 같은 Index를 위한 벡터 생성 시 편리하다.
패턴을 가지는 벡터
- sequence()
: 주어진 값만큼 숫자를 생성한다(간격은 1이다).
# sequence 함수를 써보자
sequence(3)
## [1] 1 2 3
sequence(c(3,2,4))
## [1] 1 2 3 1 2 1 2 3 4
※ 벡터를 인자로 넣는 경우, 벡터의 원소만큼 독립적으로 반복되어 생성된다.
- rep()
: 주어진 값을 반복한다. - 주요 Parameter
: rep(x: 반복할 값이 저장된 벡터, times: 반복 횟수, each: 개별 값의 반복 횟수, length: 생성될 벡터의 길이)
# rep을 써보자
# 1~2를 5회 반복해보자
rep(1:2, times = 5)
## [1] 1 2 1 2 1 2 1 2 1 2
# 2~4를 길이 7까지 반복한다.
rep(2:4, length = 7)
## [1] 2 3 4 2 3 4 2
# 2~4를 각각 3회 반복한다.
rep(2:4, each = 3)
## [1] 2 2 2 3 3 3 4 4 4
# 2~4를 각각 3회씩 3번 반복한다.
rep(2:4, each = 3, times = 2)
## [1] 2 2 2 3 3 3 4 4 4 2 2 2 3 3 3 4 4 4
# 벡터 c(a,b)에서 앞의 원소는 3회 뒤의 원소는 2회 반복하라
rep(c("a", "b"), c(3, 2))
## [1] "a" "a" "a" "b" "b"
이번 포스트에선 벡터의 연산부터 연속하는 벡터, 패턴을 갖는 벡터에 대해 학습해보았다. 특히 seq나 rep은 굉장히 단순하면서도 재밌는 기능을 가지고 있는 함수이므로, 꼭 기억하도록 하자.
다음 포스트에선 연산자와 변수 타입에 대해 공부해보도록 하자
'R > Basic' 카테고리의 다른 글
R(기초) 행렬(Matrix)(1부) (0) | 2020.06.18 |
---|---|
R(기초) 연산자와 변수 타입 (0) | 2020.06.18 |
R(기초) 데이터 타입: 벡터(Vector)(1부) (0) | 2020.06.18 |
R(기초) 데이터 타입: 스칼라 (Scalar) (0) | 2020.06.18 |
R(기초)의 데이터 타입과 변수 (0) | 2020.06.17 |