study blog

Data Structure 1 - vector, matrix, array 본문

R/1. R 기초

Data Structure 1 - vector, matrix, array

ivo_lee 2020. 1. 7. 15:32

Data Structure

변수에 저장된 데이터의 메모리 구조
cf. Data type: 저장된 데이터의 성격 (numeric, character, logical, complex 등)
Data Structure은 6개의 타입으로 나눌 수 있다.

1. 같은 데이터 타입 (3가지)
 1) Vector (1차원)

 2) Matrix (2차원)
 3) Array (3차원 이상)

2. 다른 데이터 타입 (2가지)
 1) List (1차원)

 2) Data Frame (2차원)

3. factor형

 


1. Vector (1차원)

같은 데이터 타입으로 구성
첨자 형태로 access 가능 (첨자의 시작은 1이라는 것에 주의!)
my_vector[1] 

 


# vector 생성 함수

 

 c( )

 combine의 약자

 일반적으로 규칙성이 없는 데이터 이용해서 vector 생성할 때 이용

c(1, 2, 6, 9, 10)

 # 두 vector를 이용하여 다른 vector를 만들 수 있음

 var1 = c(1, 2, 6, 9, 10)
 var2 = c(TRUE, TRUE, FALSE)
 var3 = c(var1, var2)           # 우선순위에 따라 통일

 

②  :

 단조증가, 단조감소를 표현할 때 사용 가능

 numeric에서만 사용 가능

 start: end 형태로 사용되고, 두 값 다 inclusive(포함)

3.4:10          # 3.4 4.4 5.4 6.4 7.4 8.4 9.4

 

③ seq()

 :의 일반형으로 등차수열을 생성하여 vector화

seq(from=1, to=10, by=3)

 

④ rep()

 replicate의 약자 – 지정된 숫자만큼 반복해서 vector를 생성

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

# vector 활용하기

 

length(): vector 안의 데이터의 개수 확인 (해당 자료구조의 길이)

# length는 다른 의미로도 사용 가능

seq(1,100, length=3)   # 1부터 100까지 값 가지고 벡터 만들 것. 그 벡터의 값이 3개.
		       # 구간은 2개로 나눔
		       # 출력값: 1.0 50.5 100.0
               
seq(1,100, length=7)   # 값 7개, 구간 6개
               	       # 출력값: 1.0 17.5 34.0 50.5 67.0 83.5 100.0

 

[] : vector에서의 데이터 추출

var1 = c(67,90,87,50,100)
var1[1]                 # vector의 가장 처음 원소를 추출
var1[length(var1)]      # vector의 가장 마지막 원소를 추출
var1[2:4]
var1[c(1,5)]
var1[seq(1,4)]
var1[-1]                # ‘-‘는 제외의 의미. 1번째 항을 제외한 나머지 값 추출
var1[-c(1:3)] 

 

③ names : vector 데이터의 이름

var1 = c(67, 90, 50)
names(var1)      # var1의 각 데이터에 붙은 이름 파악
names(var1) = c(“국어”, ”영어”, ”수학”)    # var1의 데이터에 이름 부여
var1["영어"]    # vector 데이터 이름으로 추출 가능

# vector의 연산

- 수치형 vector는 scalar를 이용하여 사칙연산 가능

- vector와 vector 간 연산 수행 가능

 

① scalar와 vector의 연산

var1 <- 1:3
var1*2                 # 출력값: 2 4 6       #각각의 요소에 각각 2를 곱해줌

 vector와 vector의 연산

var1 <- 1:3
var2 <- 4:6
var1+var2   # 5 7 9                           # 같은 위치에 있는 것끼리 연산

 크기가 다른 vector간 연산 – recycling rule

var3 = 5:10      # 5 6 7 8 9 10
var1+var3        # 길이 짧은 쪽의 데이터를 채움 ( 1 2 3  -> 1 2 3 1 2 3 )
# 출력값: 6 8 10 9 11 13

var4 = 5:9       # 5 6 7 8 9
var1 + var4      # 1 2 3     -> 1 2 3 1 2  # recycle 하지만 warning message
# 출력값: 6 8 10 9 11

④ vector간의 집합 연산

- union() : 합집합

- intersect() : 교집합

- setdiff() : 차집합

var1 = 1:5
var2 = 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 : 두 벡터가 완전히 같은 벡터인지 확인하는 함수

                     비교하는 두 벡터의 요소의 개수, 순서, 내용 모두 같아야 TRUE

identical(var1, var2)

 setequal: 비교하는 두 벡터의 크기, 순서와 상관 없이 내용만을 비교

var1 = c(1,2,3,3,3)
var2 = c(3,1,2)
setequal(var1, var2)   # TRUE

 

 


2. matrix (2차원)

동일한 data type을 가진 2차원 형태의 자료구조

 

# matrix 생성

 

① matrix() 함수 이용하여 생성

- matrix의 생성 기준은 열. 열을 고정시키고 행을 늘림.

matrix(1:5)     # 5행 1열짜리 matrix 생성

 

- vector 연결해서 matrix 생성 가능

var1 = matrix(c(1:21),nrow=3,ncol=7) # 3행 7열짜리 matrix

# 출력결과
       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
  [1,]    1    4    7   10  13   16   19
  [2,]    2    5    8   11  14   17   20
  [3,]    3    6    9   12  15   18   21

 
# 11 12 14 15의 값을 가져오려면?
var1[2:3,4:5]

- nrow: 행의 개수

matrix(c(1:10), nrow=3)    # 2칸이 비게 됨 -> recycling

- ncol: 열의 개수

matrix(1:10,ncol=2)

-  byrow: 행 단위로 데이터 생성. (데이터가 가로로 채워짐)

matrix(1:10,nrow=2,byrow=TRUE) 

- length(var1)  #원소(요소)의 개수

 

 

② rbind, cbind 함수 이용하여 생성

- rbind : 행 중심으로 결합

- cbind : 열 중심으로 결합

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

mat1 = rbind(var1,var2)  #행 중심. 그대로 붙음 # 2행 4열
mat2 = cbind(var1,var2)  #열 중심. 세로로 붙음 # 4행 2열

# apply

apply는 matrix에 특정 함수를 적용할 수 있게 한다.

apply(X=var1, MARGIN=1, FUN = max)    
apply(X=var1, MARGIN=2, FUN = max)    
apply(X=var1, MARGIN=1, FUN = mean)   

- 속성이 3개 들어감

① X            → 적용할 matrix

② margin    1이면 행 기준, 2면 열 기준으로 적용

③ FUN        function의 약자. 적용할 함수명 (함수 직접 만들어서 사용 가능)

 


#  matrix의 연산

 

① * : elementwise product (요소단위 곱연산)

var1 = matrix(c(1:6),ncol=3)
var2 = matrix(c(1,-1,2,-2,1,-1),ncol=3)
var1 * var2   #같은 위치의 요소끼리 연산

# 출력결과
     [,1] [,2] [,3]
[1,]    1    6    5
[2,]   -2   -8   -6

%*% : matrix product (행렬곱)

var3 = matrix(c(1,-1,2,-2,1,-1),ncol=2)

# 출력결과 
var1 %*% var3
     [,1] [,2]
[1,]    8   -4
[2,]   10   -6

③ solve() : 역행렬

역행렬이란?
matrix A가 정방행렬(nXn)일 때 다음의 조건을 만족하는 행렬 B가 존재하면 행렬 B를 행렬 A의 역행렬이라고 한다.
AB = BA = I(단위행렬 E)
solve(var1)

 

④ t() : 전치행렬 (transpose)

t(var1)   #행이 열로, 열이 행으로 (행, 열을 뒤바꿈)

 

 


3) array (3차원 이상)

3차원 이상. 같은 데이터 타입으로 구성
array(c(1:24), dim=c(3,2,4))   #3행, 2열, 4면

 

'R > 1. R 기초' 카테고리의 다른 글

데이터 입출력 - txt, csv, xml, json, excel  (0) 2020.01.09
String - stringr 패키지를 이용한 문자열 처리  (0) 2020.01.08
Data Structure 2 - list, data frame, factor  (0) 2020.01.08
Package  (0) 2020.01.06
R 기초  (0) 2020.01.06
Comments