R 벡터

이 글에서는 R의 자료 객체(data objects) 중 벡터에 대해 다뤄보고자 한다.

벡터

  • 벡터는 데이터들의 묶음인데, 벡터 안의 데이터들은 한 가지 유형으로만 구성된다. 아래는 예시이다.
char <- c(1.5, 3L, "r", "markdown")
class(char)
## [1] "character"
  • 벡터 데이터들의 나열 원소는 의미를 가진다.

벡터 생성하기

c() 함수, 연산자 “:”

  • 앞서 본 것처럼 c() 함수를 이용한다.
    • 여기서 흥미로운 것(?)은 벡터끼리의 결합이 가능하다는 것이다.
  • is.vector()를 사용해 주어진 객체가 벡터인지 확인할 수 있다.
  • 연산자 “:”을 사용하면 노가다를 하지 않을 수 있다. “a:b”는 a가 초항이고 b가 끝 항인, 공차가 1인 등차수열을 의미한다. a, b는 음의 수여도 상관 없다.
    • 연산자 “:”는 우선순위를 가진다. 아래의 식을 보면, R은 1:10의 연산을 먼저 처리해 1부터 10까지의 길이가 10인 벡터를 생성하고, 그 벡터 각각의 원소에 대해 1을 더하는 연산을 마지막으로 수행했음을 알 수 있다.
vec1 <- c(1, 2, 3)
vec2 <- c(vec1, 4, 5, 6); vec2
## [1] 1 2 3 4 5 6
vec3 <- c(6:-3)
1 : 10 + 1 # 연산자 :의 우선순위
##  [1]  2  3  4  5  6  7  8  9 10 11
  • 한편, 벡터 각 성분의 이름을 부여하는 것 역시 가능하다. names() 함수는 벡터의 이름을 불러온다. 방법은 다음과 같다.
vec_name <- c(one=1, two=2)
names(vec_name)
## [1] "one" "two"


rep() 함수

  • rep 함수는 한 대상을 반복해 주는 함수이다. 함수는 다음과 같은 구문으로 구성된다.
  • rep(x, times = n, length.out = NA, each = m)
    • 여기서 x는 반복대상으로, 벡터나 팩터 모두 될 수 있다.
    • times는 말 그대로 반복횟수이다.
    • length.out은 출력자료의 객체 길이를 제한하는 데에 쓰인다.
    • each는 벡터 내 데이터 원소 각각의 반복 횟수이다.
rep(c(0, 1), times = 3, each = 2)
##  [1] 0 0 1 1 0 0 1 1 0 0 1 1
rep(c(0, 1), 5, length.out = 5)
## [1] 0 1 0 1 0
rep(0, 10)
##  [1] 0 0 0 0 0 0 0 0 0 0


seq() 함수

  • seq(from = n, to = m, by = x, length.out = NULL, along.with = NULL)
  • seq는 말 그대로 수열을 생성해주는 함수이다. by는 증분(incremental)을 의미하고, length.out은 앞의 rep 함수에서 살펴본 것처럼 출력자료(수열)의 길이를 지정해 준다.
    • from과 to에는 숫자만이 올 수 있다.
    • by를 생략하는 대신 length.out을 지정하면, 증분이 수열 길이에 맞춰 적절히 설정되는 것을 볼 수 있다.
  • along.with는 지정한 객체와 같은 길이의 수열을 생성해 준다.
seq(from = 1, to = 10) # 1:10과 동일한 기능
##  [1]  1  2  3  4  5  6  7  8  9 10
seq(from = 0.5, to = 10.9, by = 3)
## [1] 0.5 3.5 6.5 9.5
seq(from = 1, to = 5, length.out = 10)
##  [1] 1.000000 1.444444 1.888889 2.333333 2.777778 3.222222 3.666667
##  [8] 4.111111 4.555556 5.000000
x = 1:5
seq(3, 5, along.with = x)
## [1] 3.0 3.5 4.0 4.5 5.0


vector() 함수

  • vector(mode = “”, length = n)
  • mode에는 logical, integer, list, double, character 등이 올 수 있다.

부분벡터 (subvector)

  • 벡터 이름 뒤에 대괄호[]를 붙여 부분벡터를 활용할 수 있다.
abc <- vector(mode = "logical", length = 3)
abc[2] = TRUE
abc
## [1] FALSE  TRUE FALSE
x <- 1:10
x[3] # 3번째 성분 출력 
## [1] 3
x[-3] # 3번째를 제외한 성분 출력
## [1]  1  2  4  5  6  7  8  9 10
x[c(1, 3, 5)] <- 0; x
##  [1]  0  2  0  4  0  6  7  8  9 10
y <- 1:4
y[c(TRUE, FALSE, TRUE, FALSE)]
## [1] 1 3


벡터의 연산

  • 벡터 연산의 기본 원칙은 성분 대 성분이다.
    • 연산하는 두 벡터의 길이가 같은 경우 대응되는 각 성분끼리 연산을 한다.
    • 길이가 다른 경우 긴 벡터의 길이에 맞춰져 길이가 작은 벡터가 재활용된다. (warning 출력)
e <- c(exp(1), exp(2), exp(3))
log(e); sum(e); prod(e); max(e)
## [1] 1 2 3
## [1] 30.19287
## [1] 403.4288
## [1] 20.08554
m <- 1:5
n <- 1:3 
m + n
## Warning in m + n: longer object length is not a multiple of shorter object
## length
## [1] 2 4 6 5 7
  • R에서는 scalar와 vector의 addition을 어떻게 처리할까? 보통 이 둘은 더해지지 못하나 R에서는 그냥 더한다. (element by element.) scalar와 vector의 곱은 일반적으로 생각하는 것과 같다.
  • 벡터 간의 비교 연산
    • 모든 성분의 값이 TRUE 인지 확인하려면 all() 함수 사용
    • TRUE 성분이 적어도 하나 존재하는지 확인하려면 any() 함수 사용
add <- 1:3
add + 1
## [1] 2 3 4
add * 2
## [1] 2 4 6
# 벡터 간의 비교 연산
p <- 1:10; q <- -5:4; r <- 11:13
p <= 5
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
p > q
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
p < q
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
p > r # 벡터 길이가 다르기에 warning 출력
## Warning in p > r: longer object length is not a multiple of shorter object
## length
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
any (p > q)
## [1] TRUE
all (p < r)
## Warning in p < r: longer object length is not a multiple of shorter object
## length
## [1] TRUE