728x90
반응형

벡터(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은 굉장히 단순하면서도 재밌는 기능을 가지고 있는 함수이므로, 꼭 기억하도록 하자.

다음 포스트에선 연산자와 변수 타입에 대해 공부해보도록 하자

728x90
반응형

+ Recent posts