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
반응형
728x90
반응형

이전 Scalar를 설명하면서 R에 있는 기본적인 Class들에 대해 설명을 하다보니, 분량 조절에 실패를 하고 말았다....
이번엔 R 데이터 타입의 대표 주자인 벡터(Vector)에 대해 설명할 것인데, 벡터는 스칼라보다 다뤄야할 것도 많고, 매우 중요하기도 하므로, 2개 파트로 끊어서 진행할 예정이다.

벡터(Vector)

: R에서 벡터는 가장 대표적으로 사용되는 타입으로, 다른 프로그래밍 언어의 배열(Array)와 대응되는 개념이라고 볼 수 있다. 벡터의 가장 큰 특징은 단 한가지의 클래스만 담을 수 있다는 것이다.

  • 벡터는 한 가지 Class만 담을 수 있으며, 만약 서로 다른 Class가 섞여있다면, 자동으로 그에 맞는 형변환이 이루어진다.
  • R의 벡터는 슬라이스(Slice)를 제공한다. 슬라이스란 벡터의 일부를 잘라낸 뒤, 이를 또 다시 벡터처럼 사용할 수 있는 개념이다.
  • 벡터는 c()안에 원하는 인자를 넣어서 생성할 수 있다.
    (c = Combine, 하나의 단체로 결합하다.)
  • 벡터는 중첩될 수 없다. 따라서 벡터 안에 벡터를 정의하면 단일 차원의 벡터로 변경된다.
  • 벡터의 각 원소에는 이름을 부여할 수 있다.
# 벡터를 생성해보자.
x <- c("1", "2", "3")
x
## [1] "1" "2" "3"
# 벡터 안에 벡터를 넣어서 생성해보자.
c(1,2,3,c(1,2,3))
## [1] 1 2 3 1 2 3
  • Python의 list와 달리 R의 벡터는 벡터 안에 벡터를 넣을 수 없다.
# 벡터의 각 원소에 이름을 지어보자.
math <- c(60, 80, 70)
names(math) <- c("kim", "seo", "park")
math
  • R의 코드는 굉장히 직관적이라고 할 수 있는데, names(data)는 data의 이름을 가지고 오는 함수이다.
  • data의 이름을 가지고 오는 함수에 data의 길이와 같은 벡터를 넣으면, 그것을 이름으로 사용할 수 있다.
##  kim  seo park 
##   60   80   70
names(math)
## [1] "kim"  "seo"  "park"

 

 

벡터의 길이 관련 함수

length(): 객체의 길이를 반환한다.

  • python의 len()과 같은 역할을 하는 함수로 몇 개의 인자를 가지고 있는지 확인할 수 있다.
# 벡터의 길이를 확인해보자.
x <- c(1,2,5,3)
length(x)
## [1] 4

 

NROW(): 벡터나 행렬의 행의 수를 반환한다.

  • NROW()는 그렇게 자주 쓰이는 함수는 아니며, 행렬이나 데이터프레임의 행 개수를 확인하는 nrow()와 유사한 함수이다. 차이는 벡터에서 사용될 수 있는지의 여부이다.
  • 벡터는 각각의 인자를 행으로 잡고 있기 때문에, 행의 개수로 인자의 수를 반환한다. length()와 동일한 기능을 가지고 있으므로, 편하게 length()를 쓰도록 하자.
# 벡터의 행의 수를 확인해보자.
NROW(x)
## [1] 4

 

unique(): 중복된 값을 제외한 벡터.

  • 데이터 프레임에서도 즐겨 사용되는 함수로, 벡터에서는 단순하게 중복 값을 없애는 함수로 인지하면 된다.
    (데이터 프레임에선 중복 행을 제거한다.)
  • 벡터, 데이터 프레임 모든 곳에서 자주 사용하는 함수이므로 꼭, 기억하도록 하자.
# 중복값을 제외한 벡터를 생성해보자.
x <- c(1,1,3,2,3,4,2)
unique(x)
## [1] 1 3 2 4

 

 

 

벡터 내 데이터 접근(Indexing)

: Index를 통해 내가 원하는 데이터를 가지고 오는 것은 데이터 분석의 사전 작업인 전처리(Data Handling)에서 필수 중에 필수이다.

  • 벡터는 [] 안에 Index를 적어서 내가 원하는 원소를 가지고 올 수 있다.
  • R의 인덱스는 Python을 비롯한 다른 언어들과 달리 1로 시작한다.
문법 의미
x[n] 벡터 x의 n번째 원소를 가지고 온다. n은 숫자 또는 원소의 이름인 문자열이다.(names로 확인 가능)
x[-n] 벡터 x의 n번째 원소를 제외한 나머지를 가지고 온다. n은 위의 n과 동일하다.
x[idx_vector] 벡터 x로부터 index vextor에 지정된 원소를 가지고 온다. 이때 idx_vector는 index를 표현하는 숫자 벡터 또는 원소의 이름을 표현하는 문자열 벡터이다.
x[start:end] 벡터 x의 start부터 end까지의 원소를 가지고 온다. 반환 되는 값은 start의 위치 값과 end 위치 값을 모두 포함한다.

 

# 다양한 indexing을 통해 내가 원하는 원소를 가지고 와 보자.
x <- c("apple", "banana", "melon", "chocolate", "ice cream", "corn")
x[5]
## [1] "ice cream"
x[-4]
## [1] "apple"     "banana"    "melon"     "ice cream" "corn"
x[c(1,3,5)]
## [1] "apple"     "melon"     "ice cream"
x[2:5]
## [1] "banana"    "melon"     "chocolate" "ice cream"

 

  • 이번엔 이름으로 가지고 와보자
# 다양한 indexing을 통해 내가 원하는 원소를 가지고 와 보자.
English <- c(60, 70, 80, 90)
names(English) <- c("Kim", "Lee", "Park", "Lim")

English
##  Kim  Lee Park  Lim 
##   60   70   80   90
English["Park"]
## Park 
##   80
English[c("Kim", "Lim")]
## Kim Lim 
##  60  90
# 특정 index의 이름도 쉽게 알 수 있다.
names(English)[2]
## [1] "Lee"

 

 

벡터는 R에서 가장 기본적으로 사용되는 데이터 타입이다보니, 다룰 것이 꽤 많다. 다음 포스트에선 벡터의 연산과 연속하는 벡터를 만드는 법을 한번 공부해보도록 하자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18
R(기초) 데이터 타입: 스칼라 (Scalar)  (0) 2020.06.18
R(기초)의 데이터 타입과 변수  (0) 2020.06.17
R이란?  (0) 2020.06.16

+ Recent posts