/ R

R 기초강의(5) - R 자료구조(vector)

R 강좌는 여러 절로 구성되어 있습니다.


R 자료구조

자료형(Data Type)은 저장된 데이터의 성격(숫자형, 문자형, 논리형)을 의미합니다. 이에 비해 자료구조(Data Structure)는 변수에 저장된 데이터의 메모리 구조(배열, 리스트, 테이블)를 의미합니다. 이런 메모리 구조는 객체가 생성될 때 만들어지기 때문에 자료구조를 객체형(Object Type)이라고도 합니다.

R은 mode()함수를 이용하여 데이터의 자료형을 확인할 수 있으며 class() 함수를 이용하여 자료구조, 즉 메모리 구조를 확인할 수 있습니다.

R에서 제공하는 주요 자료구조는 크게 5가지로 분류됩니다.

R의 주요 자료구조

  • Vector : 1차원 배열
  • Matrix : 2차원 배열
  • Array : 다차원 배열
  • List : 중첩 자료구조
  • Data Frame : 2차원 테이블 구조

Data Structure

( 이미지출처 : https://devopedia.org/r-data-structures )
구분 1차원 2차원 n차원
Homogeneous vector matrix array
Heterogeneous list data frame  

R의 자료구조는 크게 단일형과 다중형으로 구분됩니다. 데이터 타입이 한가지면 단일형, 여러 가지이면 다중형 입니다. 위의 그림과 표에서 보듯이 단일형에는 크게 3가지, 다중형에는 크게 2가지 자료구조가 존재합니다. 이 외에 factor라고 불리는 자료구조가 존재합니다.

여기서는 벡터(vector)에 대해서 알아보도록 하겠습니다.

vector의 특징

  • vector는 1차원의 선형 자료구조 형태로 만들어집니다.
  • vector는 하나의 Data Type으로 구성됩니다. (vector의 구성요소는 모두 같은 Data Type입니다.)
  • vector는 변수[첨자] 형태로 접근합니다. 첨자(index)는 1부터 시작합니다.

여기서 잠깐!!

  • vector 중에서 구성인자가 1개인 것을 scalar라고 합니다. 따라서 scalar는 vector 입니다.
# scalar 생성
var1 <- c(100)   # scalar
var1

vector를 생성하는 방법은 여러가지가 있으나 여기서는 대표적인 4가지 방법에 대해서 알아보겠습니다.

vector 생성방법 - c() 함수

  • c() 함수는 combine의 약자로 vector를 생성하는 가장 대표적인 방법입니다. 일반적으로 규칙이 없는 데이터로 이루어진 vector를 생성할 때 이용됩니다. c() 함수는 vector들을 하나로 합쳐서 새로운 vector를 생성할 수도 있습니다.
  • c() 함수는 vector를 생성할 때 사용되지만 다른 데이터 형태에서 일부의 데이터를 추출할 때도 사용됩니다.
# vector 생성 - c()

var1 = c(10,30,77,100)
var1

var2 = c(89,56,33)
var2

var3 = c(TRUE,FALSE,FALSE,TRUE)
var3

var4 = c("홍길동", "강감찬", "유관순")
var4

var5 = c("홍길동", 100, TRUE, 3.141592)
var5

var6 = c(var1, var2)
var6

var7 = c(var1, var4)
var7

vector 생성방법 - :

  • 콜론(:)은 수치형에만 적용할 수 있으며 1씩 증가하거나 감소하는 규칙이 있는 값으로 vector를 생성할 때 사용됩니다. start:end 형태로 사용됩니다.
  • 콜론(:) 역시 다른 데이터 형태에서 연달아 있는 특정한 행이나 열의 데이터를 추출할 때 사용할 수 있습니다.
# vector 생성 - :

var1 = 1:5
var1

var2 = 5:0
var2

var3 = 3.3:10
var3

vector 생성방법 - seq() 함수 (등차 수열)

  • seq() 함수는 sequence의 약자로 콜론(:)의 일반형이라고 보시면 됩니다. 3개의 argument인 시작(from), 끝(to), 증감치(by)를 명시해서 규칙이 있는 수치형 vector를 생성할 수 있습니다.
  • 인자의 위치에 따라 argument의 이름을 생략할 수 도 있지만 가능하면 argument 이름을 사용하는것이 readability 측면에서 좋습니다.
# vector 생성 - seq()

var1 = seq(from=1, to=5, by=1)
var1

var2 = seq(from=0.5, to=10, by=1.5)
var2

var3 = seq(from=10, to=5, by=-2)
var3

vector 생성방법 - rep() 함수

  • rep()함수는 지정하는 반복 횟수만큼 동일한 값이 복제되어 vector가 생성됩니다.
# vector 생성 - rep()    # replicate 함수

var1 = rep(1:3, times=3) # times 생략 가능
var1                     # 1 2 3 1 2 3 1 2 3 

var2 = rep(1:3, each=3)  # each는 각 원소가 반복할 횟수 지정
var2                     # 1 1 1 2 2 2 3 3 3  

vector의 Data Type 확인

  • 앞서 설명한 mode()함수와 is계열의 함수를 이용하면 vector의 Data Type을 알아낼 수 있습니다.
# vector의 Data Type

var1 = c(10,20,50,100)
var1
mode(var1)              # numeric
is.character(var1)      # FALSE
is.numeric(var1)        # TRUE
is.integer(var1)        # FALSE 
is.double(var1)         # TRUE

vector의 데이터 개수 확인

  • vector가 가지고 있는 데이터의 개수를 알아내기 위해서는 length() 함수를 이용합니다.
# vector의 개수 확인 - length()

var1 = seq(1,100,2)
var1

var2 = c(10,20,30)
var2

length(var1)    # var1의 개수 - 50
length(var2)    # var1의 개수 - 3

var3 = seq(1,100, length = 4)  # length을 이용한 vector 생성
var3

vector에서 데이터 추출

  • vector안에서 일부 데이터를 추출할 때는 대괄호([])를 이용합니다. 다른 프로그래밍 언어의 배열을 사용하는 것처럼 index를 이용하여 vector의 요소를 추출해서 사용할 수 있습니다. 단, R에서는 index의 시작이 1입니다.
  • index부분에는 위에서 설명한 c(), :, seq()등도 올 수 있습니다.
# vector 데이터 추출

var1 = c(67,90,80,50,100)
var1

var1[1]                   # 67
var1[length(var1)]        # 100
var1[2:4]                 # 90 80 50
var1[c(1,2,5)]            # 67 90 100
var1[seq(2,4)]            # 90 80 50
var1[6]                   # NA
var1[-1]                  # 1번째를 제외한 나머지
                          # 90 80 50 100
var1[-(2:5)]              # 67
var1[-c(1,2,4,5)]         # 80

vector 데이터의 이름

  • names() 함수를 이용하면 vector의 원소 각각에 이름이 있으면 이름을 문자열 형태로 출력합니다. 만약 이름이 없으면 NULL을 출력합니다.
  • vector 각 원소에 이름을 붙여주고 싶은 경우에는 c()함수와 함께 사용하여 이름을 부여할 수 있습니다.
# vector의 원소 이름
var1 = c(10,20,30)
var1

names(var1)    # NULL

names(var1) = c("국어", "영어", "수학")

names(var1)    # "국어" "영어" "수학"

var1           # 이름과 데이터 함께 출력

var1[1]        # index를 이용한 vector 원소 접근

var1["국어"]   # name을 이용한 vector 원소 접근

vector의 연산

  • 수치형 vector에 수치형 scalar를 이용하여 사칙연산을 할 수 있습니다. 또한 vector와 vector간의 빠른 연산도 지원합니다.
  • vector의 길이가 동등할 경우 각 vector의 요소들끼리 연산을 수행합니다.
  • vector의 길이가 동등하지 않을 경우 연산과정에서 데이터의 개수가 적은 vector가 데이터의 개수가 많은 vector와 동일하게 데이터의 개수를 맞추게 됩니다. 즉, 데이터 개수가 차이나는 만큼 데이터의 개수가 늘어나게 됩니다. 새롭게 생성되는 데이터는 원래 가지고 있던 데이터를 순서대로 새롭게 생성되는 데이터에 지정하게 되는데 이러한 규칙을 재사용 규칙(recycling rule) 이라고 합니다.
# vector간의 연산

var1 = 1:3
var2 = 4:6

var1                      # 1 2 3
var2                      # 4 5 6 

var1 * 2                  # 2 4 6
var1 + 10                 # 11 12 13

var1 + var2               # 5 7 9

var3 = 1:6
var3

var1 + var3               # var1 : 1 2 3 1 2 3 (recycling rule)
                          # var3 : 1 2 3 4 5 6
                          # 2 4 6 5 7 9

var4 = 1:5
var4

var1 + var4               # var1 : 1 2 3 1 2 (recycling rule)
                          # var4 : 1 2 3 4 5
                          # 연산은 되지만 warning 발생
                          # 2 4 6 5 7

vector간의 집합연산

  • vector를 대상으로 union(), intersect(), setdiff() 함수를 적용하여 집합연산을 수행할 수 있습니다.
# vector의 집합연산

var1 = c(1,2,3,4,5)
var2 = seq(3,7)

union(var1,var2)       # 합집합 : 1 2 3 4 5 6 7

intersect(var1,var2)   # 교집합 : 3 4 5

setdiff(var1, var2)    # 차집합 : 1 2 

vector간의 비교

  • vector를 대상으로 identical(), setequal() 함수를 적용하여 비교 연산을 수행할 수 있습니다.
  • identical()은 두 vector의 항목이 개수, 순서, 항목명이 모두 동일한 경우 TRUE를 반환하고
  • setequal()은 두 vector의 항목의 개수와 순서에 상관없이 항목명이 동일할 경우 TRUE를 반환합니다.
# vector간의 비교연산

var1 = c("홍길동","김길동","최길동")
var2 = c("HONG","KIM","CHOI")
var3 = c("김길동","홍길동","김길동","최길동")

identical(var1,var3)    # FALSE

setequal(var1,var3)     # TRUE

var1 = 1:3
var2 = c(1:3)
var3 = c(1,2,3)

class(var1); class(var2); class(var3)

# data type이 다르다.
identical(var1,var2)  # TRUE   
identical(var1,var3)  # FALSE  

요소가 없는 vector 생성

  • 항목을 저장할 공간의 개수만 지정해서 vector를 생성할 수 있습니다.
# 요소가 없는 vector 생성
# 항목을 저장할 공간을 생성할 때 사용

var1 = vector(mode="numeric", length=10)

var1

End.


이 포스트의 내용은 아래의 책과 사이트를 참조했습니다. 조금 더 자세한 사항을 알고 싶으시면 책을 참조하거나 해당 사이트를 방문하세요!!