R-Studio 행렬 다루기(Matrix)

R-Studio 행렬을 다루어 보기(Matrix, Vector)

Featured image

R-Studio 기본 자료형 Vector

Vector 은 배열 이라고 보아도 무방하다.
Vector 은 c(요소, 요소…)로 생성한다.
Vector 과 List 는 비슷하지만 1차원 배열과 2차원 배열 차이라고 봐도된다.
실수형 과 정수형 둘다 Num형 이다.
R은 1베이스 시작이다 즉, 배열 Index가 1부터 시작한다.

사용된 함수

이름 함수이름 사용법
Vector c() Numeric : c(1, 2, 3, 4)
Char : c(“가”, “나”, “다”, “라”)
List list() list(c(1, 2, 3, 4), c(‘a’, ‘b’, ‘c’))
List->Vector unlist() unlist(리스트변수)
Matrix matrix() matrix(vector, nrow = [정수 값])
Structure str() str(조회 하고자 하는 변수)


Vector와 List

# 아래 주석은 콘솔 값 입니다.

### Vector
myVector <- c(1, 2, 3, 4, 5, 6) # 벡터를 생성한다. 요소는 Numeric형 6개
# [1] 1 2 3 4 5 6
str(myVector) # 생성한 벡터의 변수 myVector의 구조를 확인한다.
# num [1:6] 1 2 3 4 5 6 
# Numeric 형태 이며, [1행 6열]의 형태이다.

myVector_Double <- c(1.1, 1.2, 1.3, 1.4) # 실수형 자료형을 Vector에 넣고
str(myVector_Double) # 그 변수의 구조를 확인해보자.
# num [1:4] 1.1 1.2 1.3 1.4
# 역시 Numeric 형태이다.

# JAVA, C++, C# 등은 정수, 실수, 문자, 문자열 형태의 자료형이 뚜렷하게 나뉘지만
# R은 그러지 않고 애매모호 하다.

### List함수
myLists <- list(c(1, 2, 3, 4, 5), c('a', 'b', 'c')) # List를 생성한다.
myLists # 그리고 출력 해본다.
# [[1]]
# [1] 1 2 3 4 5
# 
# [[2]]
# [1] "a" "b" "c"
# JAVA로 바꾸어 보면 [0][1] ~ [0][5] 배열 Index가 
# R은 [[1]][1:5] 인 것이다. 실제로 인덱싱을 해본다면.

myLists[[1]][1:5]
# [1] 1 2 3 4 5 으로 나온다. 그렇다면 2행 으로 접근 하려면?
myLists[[2]][1:5] 
# [1] "a" "b" "c" NA  NA  그렇다. [[2]]로 바꿔 주면 된다!
# 그런데 NA는 무엇인가? 그렇다! NULL 값이라 보면된다. 0도 아니고 공백도 아닌 NULL 값이다.

str(myLists) # 구조를 출력 해 본다.
# List of 2 (2개의 리스트 구조 를 가지고 있다)
#  $ : num [1:5] 1 2 3 4 5 (1행은 Numeric)
#  $ : chr [1:3] "a" "b" "c" (2행은 Char)

Matrix 함수

mat_a <- matrix(myVector, nrow = 3) # 행렬 구조를 만든다.
# 이때 matrix 함수의 인자값 중 첫번째는 미리 생성해둔 Vector 변수를 넣고
# 두번째 인자 값으로는 nrow = 정수값을 넣는다.
# 일단 출력 해보자.
mat_a
# 		[,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6
# 기왕 한거 구조까지 출력 해보자!
> str(mat_a)
# num [1:3, 1:2] 1 2 3 4 5 6
# num [행, 열] 값이다. 즉, 행은 1행 3열 이다. 즉, 1행 3열 벡터를 세로로 눕힌거다.
# 그렇담 오른쪽은? 열이 1행 2열 상태로 있는것이다. 가로로 말이다.
# 쉽게 보자면 3행 2열 인것이다.

### Matrix의 nrow는..?
mat_b <- matrix(myVector, nrow = 2)
mat_b
# 		[,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6
# 근데 사실 이쯤 되면 눈치 챘을것이다.
# 그렇다! nrow = 2 는 2행 을 먼저 맞추고 나머지는 열로 나열하는 것!
# nrow = 3 이면? 위처럼 1 2 3을 행 우선으로 1 2 3 을 나열 하고 그 다음
# 열로 넘어가  4 5 6을 행 우선 나열한다!
# 그렇다면 nrow = 1로 한다면? 해보면 되지!

mat_b <- matrix(myVector, nrow = 1)
mat_b
#     	[,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    2    3    4    5    6
# 음! 우리가 원하는 모습은 아니다! 이해를 돕기위한 극단적인 방법이다.
# 그렇다면 열우선 으로 나열 하려면?

# 열우선 맵핑
mat_c <- matrix(myVector, nrow = 2, byrow = T) # byrow = T 옵션
mat_c
# 		[,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    4    5    6
# 그렇다! 열 우선으로 1, 2, 3을 나열 하고 그 다음 행으로 넘어간다!
# nrow 옵션으로 행의 갯수를 정하고, byrow 를 T로주면 속성 원자값 들을 열우선으로
# byrow 을 기재하지 않는다면 송성 원자 값들을 행 우선으로 나열 해준다.

Matrix 함수의 다른 옵션

# 어트리뷰트 속성명 설정 해줌.
mydim <- list( c("김", "박"), c("국어", "영어", "수학") ) # list 생성
mat_d <- matrix(myVector, nrow=2, byrow = T, dimnames = mydim)
# dimnames = 행, 컬럼 리스트
# list로 행, 열 순서대로 레이블(label) 을 만들어 주고 변 수에 넣어준다.
# dimnames = 변수 인자로 행 과 열의 이름을 원하는 것으로 바꾼다.
mat_d
#    국어 영어 수학
# 김    1    2    3
# 박    4    5    6
# 신기방기 하다.
str(mat_d)
# num [1:2, 1:3] 1 4 2 5 3 6
#  - attr(*, "dimnames")=List of 2
#   ..$ : chr [1:2] "김" "박"
#   ..$ : chr [1:3] "국어" "영어" "수학"
# 속성 원자 값은 numeric 형 2행[1:2] 3열[1:3]을 가지고 있다.
# 그 순서는 먼저 김, 박 레이블, 그리고 국어 영어 수학 레이블이다. 

# seq를 이용한 벡터 인덱싱
somedata <- seq(10, 100, by=10)
somedata
#  [1]  10  20  30  40  50  60  70  80  90 100

# 9번째 요소 출력
somedata[9]

# 1~3번째 요소 출력
somedata[1:3]

# 요소만 따로 출력
somedata[c(1, 3, 7)]
# [1] 10 30 70

# 첫번재 요소만 제외하고 출력
result = somedata[-1]
result
# [1]  20  30  40  50  60  70  80  90 100

# 1부터 3까지를 제외하고 출력
# result0 = somedata[-c(1:3)]
result0 = somedata[-(1:3)]
result0
# [1]  40  50  60  70  80  90 100

# 50 제외 전부 출력
result1 = somedata[ somedata != 50 ]
result1
# [1]  10  20  30  40  60  70  80  90 100

# 70이상 요소만 출력
result2 = somedata[ somedata >= 70 ]
result2
# [1]  70  80  90 100

어찌된게 JAVA나 C++보다 어려운게 R인것 같다.
오픈소스 이므로 같은 기능이지만 다른 함수들이 굉장히 많다.
분석가나 개발자가 익혀야할 함수들이 엄청나게 많다…
하지만 생각보다 짧은 코드로 많은 효과를 낼 수 있는 언어인것 같다.
이와 밀접하게 Python 언어가 있다.